gpt4 book ai didi

java - 特定于子类的代码——我应该使用抽象基类方法还是接口(interface)?

转载 作者:行者123 更新时间:2023-11-29 09:55:00 27 4
gpt4 key购买 nike

我有一个父类(super class) Animal,它有两个子类 Cat 和 Dog。狗和猫都需要有特定的说话和移动方法。以下是实现此目的的两种选择:

  1. Animal 将有两个抽象方法,move() 和 speak(); Dog、Cat 和 Dog 各自覆盖这两个方法,因此它们是特定于它们的。
  2. 我可以有一个具有通用动物方法 move() 和 speak() 的接口(interface),两个子类实现这些方法,因此它们再次特定于它们。

这些方法中的一种比另一种更合适吗?我意识到如果我有一个动物 ArrayList,我会写:

ArrayList Animal<allAnimals> = new ArrayList <Animal>():
allAnimals.add(new Dog());
allAnimals.add(new Cat());

//If I override the methods, I can simply go:
for (Animal a: allAnimals) a.move();

//Where as if I implemented the methods, I would not need be able to do this. I would need to cast the animal as its specific animal. e.g. If I knew the animal was a dog.

Dog aDog= (Dog) a;
a.move();

因此,根据使用的情况,覆盖和实现可能具有某些优点和缺点。其他人可以详细说明吗?

最佳答案

首先,从子类的角度来看,覆盖或实现一个方法没有区别。因此,您编写的代码在所有情况下都将完全相同(在 Java 中,所有方法都像 C++ virtual 函数一样工作;调用的方法是被引用的实际类之一)。

因此,决定是定义一个作为接口(interface)、抽象类或可实例化类的父类(super class)。

如果创建父类(super class)对象(new Animal())有意义,则应使用可实例化类。

抽象类,当没有父类的对象时,但某些方法的实现将由所有(或几乎所有)子类共享。

接口(interface),当你只定义契约并且实现留给每个子类时。

这取决于问题的范围来决定使用哪种。例如,如果 move() 只是表示“改变动物的 x,y 坐标”,那么它可能应该是抽象类中的一个实现方法。但是,如果您必须定义动物如何移动,那么 Animal 最好是一个接口(interface),以便每个子类都定义它。

关于java - 特定于子类的代码——我应该使用抽象基类方法还是接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16004651/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com