鉴于以下情况:
Dog rover = new Puppy("rover"); // Where Puppy extends Dog
一个学生问你为什么要或需要一个Dog对象来指向一个Puppy对象?我唯一能想到的答案是:假设我们有一个狗和小狗的游戏程序。Puppy可能有一些Dog没有的特殊属性和方法。在游戏过程中,我们可能希望变量“rover”能够指向一只狗而不是小狗。我对这个答案很满意,但是否有其他类型的用例,让父类指向子类会有用?
lf5gs5x21#
为什么你会想要或需要一个Dog对象来指向一个Puppy对象呢?虽然学生未能解释要点(混淆),但问题绝对合理。通常,当你构建域模型时,它应该反映真实的类型和对象。所以Dog〉Puppy层次结构作为一个例子是不完整的,因此看起来很奇怪。但是,当您添加更多类型与Puppy相同级别时,例如GrownDog,那么层次结构就变得更有意义,并为您提供更好的示例。GrownDog可以有后代或可以守卫,Puppy可以吮吸牛奶或可以成为一个有爪子的球(在良好的饲料后)-这些是相同级别类型的不同例子。当你有两个或更多相同级别的类型后,你就更清楚为什么你可能需要把GrownDog和/或Puppy当作Dog了--当你不关心细节,但需要一些共同的行为时。例如,通过摇摆和吠叫来实现greetOwner(Dog)。
Dog
Puppy
GrownDog
greetOwner(Dog)
8ulbf1ek2#
Dog对象没有指向Puppy对象。一个Dog对象只能指向一个Dog对象,而Puppy是它的一个对象。你不能
Dog rover = new Kitten();
这将无法编译,因为kitten永远不是狗。puppy是。你可以做Dog rover = new BullDog(),所有的狗都有一个叫做wagTail()的方法。但是,由于斗牛犬有短粗的小尾巴,虽然他们技术上可以摇尾巴,他们实际上没有一个。你对你学生的多态性解释是正确的(如上所述),但是他的问题没有意义
kitten
puppy
Dog rover = new BullDog()
wagTail()
2条答案
按热度按时间lf5gs5x21#
为什么你会想要或需要一个Dog对象来指向一个Puppy对象呢?
虽然学生未能解释要点(混淆),但问题绝对合理。
通常,当你构建域模型时,它应该反映真实的类型和对象。所以
Dog
〉Puppy
层次结构作为一个例子是不完整的,因此看起来很奇怪。但是,当您添加更多类型与
Puppy
相同级别时,例如GrownDog
,那么层次结构就变得更有意义,并为您提供更好的示例。GrownDog
可以有后代或可以守卫,Puppy
可以吮吸牛奶或可以成为一个有爪子的球(在良好的饲料后)-这些是相同级别类型的不同例子。当你有两个或更多相同级别的类型后,你就更清楚为什么你可能需要把
GrownDog
和/或Puppy
当作Dog
了--当你不关心细节,但需要一些共同的行为时。例如,通过摇摆和吠叫来实现greetOwner(Dog)
。8ulbf1ek2#
Dog
对象没有指向Puppy
对象。一个Dog
对象只能指向一个Dog
对象,而Puppy
是它的一个对象。你不能这将无法编译,因为
kitten
永远不是狗。puppy
是。你可以做Dog rover = new BullDog()
,所有的狗都有一个叫做wagTail()
的方法。但是,由于斗牛犬有短粗的小尾巴,虽然他们技术上可以摇尾巴,他们实际上没有一个。你对你学生的多态性解释是正确的(如上所述),但是他的问题没有意义