【问题标题】:Purpose of having abstract child by extending concrete parent通过扩展具体父对象来获得抽象子对象的目的
【发布时间】:2011-08-26 03:23:18
【问题描述】:

有时,我遇到了一些如下的类设计。

abstract class animal {
    public abstract void speak();
}

class dog extends animal {

    @Override
    public void speak() {
        // Do something.
    }

}

abstract class abstract_dog extends dog {
    @Override
    public abstract void speak();
}

我想知道,开设abstract_dog 课程的目的是什么?为什么我们又把非抽象的说法“改造”成了抽象的说法?

【问题讨论】:

  • 注意:如果您控制类层次结构,更好的方法是完全消除具体的狗类,或者让它成为 abstract_dog 的子类。更喜欢将非叶类抽象化。

标签: java oop


【解决方案1】:

如果你想创建一个基类来强制人们覆盖speak,但继承Dog

【讨论】:

  • 虽然您的回答在技术上是正确的,但如果我在审查过程中发现它,我仍然会认为这是一种代码异味......(仍然 +1)
  • @nfechner:这完全取决于具体情况。我认为我需要在 5 年以上的发展中做到这一点。
  • +1 原因很简单,尽管您的答案(以及问题)缺乏一些现实情况。
  • @SLaks 一个有充分理由的、有效的代码异味仍然是一种,因为您仍然记得您需要这样做一次这一事实证明了这一点。我认为,人们应该将其视为一种黑客行为并使用它,同时在上面放一个很大的免责声明:“儿童:不要在家里这样做”
【解决方案2】:

我同意 SLaks,并认为这将是现实生活中的情况:

abstract class animal {
    public abstract void speak();
}

class dog extends animal {

    @Override
    public void speak() {
        // Dog says 'bark'
    }

}

abstract class abstract_dog extends dog {
    @Override
    public abstract void speak();
}

class poodle extends abstract_dog {
    @Override
    public void speak() {
        // poodle says 'yip yip'
    }
}

class great_dane extends abstract_dog {
    @Override
    public void speak() {
        // great dane says 'ruff ruff'
    }
}

如果您希望创建一个新的子类实现speak 方法并且dog 类可能具有新子类不必实现的其他方法,我认为您会使用它。
更多地了解您的具体情况将有助于确定是否有更好的设计适合这种情况。

【讨论】:

  • 但是在这个例子中你也可以跳过 abstract_dog。
  • @Buhb,这是真的,这是这个设计的一个潜在问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 2018-12-12
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多