java代码复制继承

x4shl7ld  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(266)
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将使用acton(o)执行acton(o,i),并删除repeat函数。。。。。
但在我看来,以下答案看起来是正确的,但它是错误的,为什么:
agent2必须从agent1继承,agent2将使用acton(o,i)执行acton(o),并删除repeat函数
编辑:粗体agent2

snz8szmq

snz8szmq1#

第一种选择:
agent1必须从agent2继承,agent1将使用acton(o)执行acton(o,i),并删除repeat函数。。。。。
可能的实施:

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将使用acton(o,i)执行acton(o),并删除repeat函数
agent1不能使用 actOn(o,i) 执行时 actOn(o) 因为如果代理2 extends agent1然后agent2将是从agent1继承的(不是viceversa),因此 actOn(o,i) 代理1不可用。
第二种选择是错误的,第一种是正确的。
第二选择编辑:
agent2必须从agent1继承,agent2将使用acton(o,i)执行acton(o),并删除repeat函数
实施尝试:

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 第一。如果练习没有设置任何关于创建额外变量的限制,那么我看不出第二个答案有什么问题。

相关问题