java 使父对象指向子对象的用例

xqk2d5yq  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(154)

鉴于以下情况:

Dog rover = new Puppy("rover");  // Where Puppy extends Dog

一个学生问你为什么要或需要一个Dog对象来指向一个Puppy对象?我唯一能想到的答案是:
假设我们有一个狗和小狗的游戏程序。Puppy可能有一些Dog没有的特殊属性和方法。在游戏过程中,我们可能希望变量“rover”能够指向一只狗而不是小狗。
我对这个答案很满意,但是否有其他类型的用例,让父类指向子类会有用?

lf5gs5x2

lf5gs5x21#

为什么你会想要或需要一个Dog对象来指向一个Puppy对象呢?
虽然学生未能解释要点(混淆),但问题绝对合理。
通常,当你构建域模型时,它应该反映真实的类型和对象。所以DogPuppy层次结构作为一个例子是不完整的,因此看起来很奇怪。
但是,当您添加更多类型Puppy相同级别时,例如GrownDog,那么层次结构就变得更有意义,并为您提供更好的示例。GrownDog可以有后代或可以守卫,Puppy可以吮吸牛奶或可以成为一个有爪子的球(在良好的饲料后)-这些是相同级别类型的不同例子。
当你有两个或更多相同级别的类型后,你就更清楚为什么你可能需要把GrownDog和/或Puppy当作Dog了--当你不关心细节,但需要一些共同的行为时。例如,通过摇摆和吠叫来实现greetOwner(Dog)

8ulbf1ek

8ulbf1ek2#

Dog对象没有指向Puppy对象。一个Dog对象只能指向一个Dog对象,而Puppy是它的一个对象。你不能

Dog rover = new Kitten();

这将无法编译,因为kitten永远不是狗。puppy是。你可以做Dog rover = new BullDog(),所有的狗都有一个叫做wagTail()的方法。但是,由于斗牛犬有短粗的小尾巴,虽然他们技术上可以摇尾巴,他们实际上没有一个。
你对你学生的多态性解释是正确的(如上所述),但是他的问题没有意义

相关问题