【问题标题】:Call toString() Child method from parent从父调用 toString() 子方法
【发布时间】: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.classChicken.class]。

【问题讨论】:

  • 您根本没有显示ChickenFarm,但大概ChickenFarm 构造函数应该只采用Chicken,而不是任何Animal。也许您实际上应该将Farm 设为通用,这样您就有了Farm<Chicken>?
  • @Kartik 那没用。如果您在 Animal 上调用 toString(),而此 Animal 是 Cat,则将调用 Cat 的 toString() 方法。这就是多态性的全部意义所在。
  • @JonSkeet 请检查更新,我添加了更多点以更清楚,我希望现在清楚。
  • @Smutje 完全正确,但Animal.class 的所有子类型都继承自主AnimalFarms.class 的所有子类型都继承自主Farm。最后,客户端将仅调用 Fram 构造函数来确定类型,例如 Farm farm = new Farm(Type.Chicken) 有没有办法做到这一点而不是调用子类,例如 Farm farm = new ChickenFarm()
  • 目前还不清楚。如果您提供minimal reproducible example,它真的会有所帮助。 (您当前的代码无法编译,而且您根本没有显示 ChickenFarm。您也没有显示任何仅在 Chicken 中的方法。)如果没有更清晰的问题描述,我们不太可能能够来帮助你。

标签: java inheritance overriding multiple-inheritance


【解决方案1】:

我建议用动物应该实现的方法定义一个接口IAnimal

然后:

类 Animal 实现 IAnimal

类 Farm 实现 IAnimal

那么 Animal 和 Farm(还有 ChickenFarm)的所有子类都必须实现 aninmals 方法。

【讨论】:

  • 我不认为 Animal 和 Farm 都应该实现 IAnimal 类。方法不好。
  • 好的,如果您在 AnimalFarm 中更改 Farm 就可以了。 ChickenFarm 是 AnimalFarm 的子类!!
猜你喜欢
  • 1970-01-01
  • 2017-06-26
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
相关资源
最近更新 更多