【问题标题】:code duplication inheritence代码重复继承
【发布时间】:2023-03-04 18:55:01
【问题描述】:
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

【问题讨论】:

  • 这种问题应该在codereview.stackexchange.com问。
  • 恐怕你的问题不清楚。 “说错了”是什么意思?
  • (我想我可能理解,但问题确实可以先澄清。)

标签: java inheritance code-duplication


【解决方案1】:

第一个选项:

Agent1 必须从 Agent2 继承,Agent1 会执行 actOn(o,i) 使用actOn(o),同时删除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) 使用actOn(o,i),同时删除repeat函数"

Agent1 在执行actOn(o) 时不能使用actOn(o,i),因为如果Agent2 extends Agent1 则Agent2 将继承自Agent1(反之亦然),因此actOn(o,i) 对Agent1 不可用。

第二个选项是错误的,第一个是正确的。

第二个选项 编辑

" Agent2必须继承Agent1,Agent2会执行actOn(o) 使用actOn(o,i),同时删除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);
       }
    }
}

如您所见,您无法在 Agent2 类中从 actOn(o) 调用 actOn(o, i),除非您首先声明并初始化 i。如果练习没有对创建额外变量设置任何限制,那么我看不出第二个答案有什么问题。

【讨论】:

  • 好吧,您还问如何改进代码:)
  • @Angelo Oparah:我提供了这个答案,我的问题是为什么第二个选项是错误的?
  • @student 我编辑了我的回复,可能就是你要找的内容
  • 感谢帮助,但是选项2有错误(标记为粗体),您能解释一下为什么选项2是错误的吗?
  • @student 我添加了一个可能的解释
猜你喜欢
  • 1970-01-01
  • 2012-06-02
  • 2013-07-24
  • 2013-03-10
  • 2020-10-19
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2014-07-18
相关资源
最近更新 更多