【发布时间】:2019-03-22 21:39:04
【问题描述】:
我知道我可以从父实例调用子方法,但是我需要从父实例调用toString()child,我就是不知道如何确定。
例如:
class Animal {
// Some code
}
class Chicken extend Animal{
String toString(){
return "I'm a Chicken";
}
}
class Duck extend Animal{
String toString(){
return "I'm a Duck";
}
}
我知道我可以像Animal cat = new Cat()这样称呼孩子
但我的问题是我的发起依赖于另一个发起,例如:
class Farm{
private Animal animal;
public Farm(Animal animal){
this.animal = animal;
}
}
因此,当我需要调用 ChickenFarm()(它是 Farm.class 的子类)时,我需要从 Chicken.claas 获取方法而不是 *Animal.class`。
有什么我错过的方法吗?
更新:
我不需要给客户做很多选择,我的意思是有很多*Farm.class类。
所以客户只会用enum 类型或其他东西调用Farm.class,我如何确定使用哪个孩子取决于类型或某些东西,例如(Type.Chicken)将去团队[ChickenFarm.class和Chicken.class]。
【问题讨论】:
-
您根本没有显示
ChickenFarm,但大概ChickenFarm构造函数应该只采用Chicken,而不是任何Animal。也许您实际上应该将Farm设为通用,这样您就有了Farm<Chicken>? -
@Kartik 那没用。如果您在 Animal 上调用 toString(),而此 Animal 是 Cat,则将调用 Cat 的 toString() 方法。这就是多态性的全部意义所在。
-
@JonSkeet 请检查更新,我添加了更多点以更清楚,我希望现在清楚。
-
@Smutje 完全正确,但
Animal.class的所有子类型都继承自主Animal,Farms.class的所有子类型都继承自主Farm。最后,客户端将仅调用 Fram 构造函数来确定类型,例如Farm farm = new Farm(Type.Chicken)有没有办法做到这一点而不是调用子类,例如Farm farm = new ChickenFarm()? -
目前还不清楚。如果您提供minimal reproducible example,它真的会有所帮助。 (您当前的代码无法编译,而且您根本没有显示 ChickenFarm。您也没有显示任何仅在
Chicken中的方法。)如果没有更清晰的问题描述,我们不太可能能够来帮助你。
标签: java inheritance overriding multiple-inheritance