让我们说我正在编写一个动物园模拟器(我在处理继承时最喜欢的例子)。我有一个普通的Animal
课程。然后我有两个extend Animal
调用Bird
的类和另一个调用LandAnimal
的类。 Bird
的所有子类都将以相同的方式移动(我不打算在我的动物园中使用任何鸵鸟!),同样使用LandAnimal
。因此,我在move()
类中创建了Animal
方法。但鸟类和陆地动物的移动方式却完全不同,以至于我不想在方法中添加任何东西。所以我标记了abstract
,忽略了Bird
的所有子类都必须实现它的事实。这对我来说似乎并不好,即使代码只是
@Override
public void move()
{
super.move();
}
在每个文件中都有这种感觉仍然不合适。
主要问题是:我有没有办法让直接子类实现一个方法(Bird
必须但Sparrow extends Bird
类没有)?
编辑:我忽略了与我的模拟器有关的事情。我宁愿没有3个不同的列表来迭代并在它们上面调用move()
。我想有一个ArrayList<Animal>
我可以用来更新和绘图。
答案 0 :(得分:4)
如果您在move()
中实施Bird
方法并且Sparrow
不必更改它,那么您不必在Sparrow
中实现它,它将继续按原样而需要重新实现它以仅调用super.move();
。这就是继承的整个想法:在子类中,你重用了超类中的代码,只有在行为与父类不同的情况下才添加或覆盖方法。
答案 1 :(得分:0)
如果Bird
实施了该方法而Sparrow
扩展了Bird
,那么Sparrow
就会有一个实现;它不需要提供另一个。
答案 2 :(得分:0)
是 - 对于abstract
方法(和接口方法,它们是相同的),每个类必须实现所有这些,但实现它们的超类计为有效。因此,如果Bird
实现抽象move
方法,则Sparrow
不必,因为其父类已经实现了它。