【问题标题】:Only direct subclasses must implement method只有直接子类必须实现方法
【发布时间】:2014-09-07 22:16:03
【问题描述】:

假设我正在编写一个动物园模拟器(处理继承时我最喜欢的例子)。我有一个普通的Animal 类。然后我有两个类,extend Animal 称为Bird,另一个类称为LandAnimalBird 的所有子类都将以相同的方式移动(我不打算在我的动物园里养鸵鸟!),LandAnimal 也是如此。因此,我在Animal 类中做了一个move() 方法。但是鸟类和陆地动物的移动方式如此不同,以至于我不想在该方法中添加任何内容。所以我将它标记为abstract,忽略了Bird 的所有子类都必须实现它的事实。这对我来说似乎不太好,即使代码只是

@Override
public void move()
{
    super.move();
}

在每个文件中都包含它仍然感觉不对。

主要问题是:有什么办法让我只 direct 子类实现一个方法(Bird 必须,但 Sparrow extends Bird 类没有)?

编辑:我忽略了一些与我的模拟器有关的东西。我宁愿没有 3 个不同的列表来迭代并在它们上调用 move()。我想要一个ArrayList<Animal> 可以用来更新和绘图。

【问题讨论】:

  • 是的;只在Bird 中实现它。
  • 如果您在Bird 中实现move() 方法,那么子类可以选择再次覆盖它,但不必这样做。你的说法是不正确的。

标签: java inheritance


【解决方案1】:

如果你在Bird中实现了move()方法,而Sparrow不必改变它,那么你不必在Sparrow中实现它,它会被原样继承无需重新实现它只调用super.move();。这就是继承的全部思想:在子类中重用来自超类的代码,并且只在行为与父类不同的情况下添加或覆盖方法。

【讨论】:

  • @BitNinja 没关系,ArrayList<Animal> 可以包含其任何具体子类的实例(无论层次结构有多深),只要您坚持调用存在于Animal,您可以将所有动物园添加到同一个列表中,并对列表中包含的对象调用方法。这就是多态性的力量——它与继承一起工作
  • 即使animals 中的某些项目可能不是Birds,我是否允许for (Bird bird : animals) 其中animalsArrayList<Animal>
  • @BitNinja 不,但你可以这样做 for (Animal animal : animals)
  • 但这就是问题所在。如果我正确理解了您的答案,那么 Animal 类中甚至不会存在该方法。
  • @BitNinja 什么方法? move() 存在Animal 类中,即使它没有在那里实现。当您填写列表时,您可以使用 do 实现它的具体子类来完成它,因此可以调用它。你为什么不试试呢?如果你构建一个实际的例子并看看事情是如何运作的,那就更好了。
【解决方案2】:

如果Bird实现了方法并且Sparrow扩展了Bird,那么Sparrow有一个实现;它不需要提供另一个。

【讨论】:

    【解决方案3】:

    是的——对于abstract 方法(和接口方法,它们是同一个东西),每个类都必须实现它们,但实现它们的超类算作有效。所以如果Bird 实现了抽象的move 方法,Sparrow 就不需要了,因为它的父类已经实现了。

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 2019-07-02
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2012-01-23
      • 2020-12-29
      相关资源
      最近更新 更多