代码重复继承

时间:2016-05-10 06:08:41

标签: java inheritance code-duplication

then

如何通过减少代码重复来改进此代码? 答案说:

  

Agent1必须从Agent2继承,Agent1将使用actOn(o)执行actOn(o,i),并删除重复功能......

但在我看来,以下答案看起来是正确的,但错误,为什么:

  

" Agent2必须从Agent1继承, Agent2 将使用actOn(o,i)执行actOn(o),并删除重复功能"

编辑:大胆 Agent2

1 个答案:

答案 0 :(得分:0)

第一个选项:

  

Agent1必须从Agent2继承,Agent1将执行actOn(o,i)   使用actOn(o),还删除重复函数.....

可能的实施:

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);
        }
    }
}

第二个选项:

  

&#34; Agent2必须从Agent1继承,Agent1将执行actOn(o)   使用actOn(o,i),并删除重复功能&#34;

Agent1在执行actOn(o,i)时无法使用actOn(o),因为如果Agent2 extends Agent1,那么Agent2将是从Agent1继承的(而不是反之的),因此actOn(o,i)赢了&# 39;代理商1可以使用。

第二种选择是错误的,第一种选择是正确的。

第二个选项 编辑

  

&#34; Agent2必须从Agent1继承, Agent2 将执行actOn(o)   使用actOn(o,i),并删除重复功能&#34;

实施尝试:

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),否则无法从Agent2类中的actOn(o)调用i。如果练习没有对创建额外变量设置任何限制,那么我就无法看到第二个答案有什么问题。