2016-05-10 2 views
0
public abstract class Agent1 { 
    public abstract void actOn(Object o); 
    public void repeat(Object o, int i) { 
     for (int j = 1; j <= i; j++) { 
      actOn(o); 
     } 
    } 
} 

public abstract class Agent2 { 
    public abstract void actOn(Object o, int i); 
    public void repeat(Object o, int i) { 
     for (int j = 1; j <= i; j++) { 
      actOn(o, j); 
     } 
    } 
} 

Как этот код может быть улучшен путем уменьшения дублирования кода? ответ говорит:наследование дублирования кода

Agent1 должен наследоваться от agent2 и Agent1 выполнит Актон (о, я) с помощью Актон (о), а также удалить функцию повтора .....

но, на мой взгляд, следующий ответ выглядеть правильно, но его не так, почему:

"agent2 должен наследоваться от Agent1 и agent2 выполнит Актон (о) с помощью Актон (O, I), а также удалить повторная функция "

EDIT: Смелый agent2

+1

Этот вопрос можно задать по адресу http://codereview.stackexchange.com/. – Jens

+0

Боюсь, что ваш вопрос непонятен. Что вы подразумеваете под словом «говорите, что ошибаетесь»? –

+1

(я думаю, что я * могу * понять, но вопрос действительно может возникнуть с тем, чтобы сначала выясниться.) –

ответ

0

Первый вариант:

Agent1 должен наследоваться от agent2 и Agent1 выполнит Актон (о, я) использованием Актон (о), а также удалить функцию повторения .....

Возможная реализация:

public abstract class Agent1 extends Agent2{ 
    public void actOn(Object o, int i){ 
     // do something with i 
     actOn(o); 
    } 
    public abstract void actOn(Object o); 
} 

public abstract class Agent2 { 
    public abstract void actOn(Object o, int i); 
    public void repeat(Object o, int i) { 
     for (int j = 1; j <= i; j++) { 
      actOn(o, j); 
     } 
    } 
} 

Второй вариант:

"agent2 должен наследоваться от Agent1 и Agent1 выполнит Актон (о) с использованием Актон (о, я), а также удалить функцию повтора"

Агент1 не может использовать actOn(o,i) при выполнении actOn(o), потому что, если агент2 extends Агент1, то агент 2 будет наследовать от Agent1 (не наоборот), поэтому e actOn(o,i) не будет доступен для Agent1.

Второй вариант неправильный, первый правильный.

Второй вариантEDIT:

"agent2 должен наследоваться от Agent1 и agent2 выполнит Актон (о) с использованием Актон (о, я), а также удалить функцию повтора "попытка

Реализация:

public abstract class Agent2 extends Agent1{ 
    public void actOn(Object o){ 

     actOn(o, i); // what is i ??? 
    } 
    public abstract void actOn(Object o, int i); 
} 

public abstract class Agent1 { 
    public abstract void actOn(Object o); 
    public void repeat(Object o, int i) { 
     for (int j = 1; j <= i; j++) { 
      actOn(o); 
     } 
    } 
} 

Как вы можете видеть, вы не можете позвонить actOn(o, i) из actOn(o) в пределах класса Agent2, если вы сначала не объявите и не инициализируете i. Если в упражнении не было никаких ограничений на создание дополнительных переменных, то я не вижу ничего плохого во втором ответе.

+0

Мой вопрос, почему второй вариант неправильный? – student

+0

Ну, вы также спрашивали, как можно улучшить код :) –

+0

@ Angelo Oparah: этот ответ я предусмотрел, мой вопрос в том, почему второй вариант неправильный? – student

Смежные вопросы