如果程序设计正确,为什么有人会覆盖方法?

Moz*_*zza 2 java inheritance overriding interface

我理解压倒一切的作用及其作用.我不明白的是,如果课程设计"正确",为什么有人需要使用它?

例如,假设我有一个名为Animal的类,我添加了一个说话方法.然后,我有几个继承动物的课程,如牛,狗和猫.但这些"说话"中的每一个都不同.奶牛做:system.out.println("moo").狗做"woof",猫做"喵".

我的问题是,如果奶牛,狗和猫都必须覆盖说话方法,那为什么我甚至会首先在动物课上说话呢?

我曾尝试在线和Stackoverflow上研究原因,但似乎没有人给我一个具体的答案.我最好的是我应该真正使用一个接口(来自声称从具体类扩展的帖子是EVIL).

gbt*_*mon 5

一个答案是多态性.

当讲话在这个Animal级别定义时,它允许我这样做.

ArrayList<Animal> animals = new ArrayList<Animal>();
animals.add(new Dog("Charlie"));
animals.add(new Bird("Tweety"));
animals.add(new Duck("Cheese and Quackers"));

for( Animal a : animals ) 
    a.speak();
Run Code Online (Sandbox Code Playgroud)

由于speak具有在基类中定义的基本行为,因此我可以保证会有一些说话行为,因此我可以从基类调用该行为安全,而不会有调用类不存在的方法的风险.如果特定的类具有更复杂的实现,那很好,但我至少保证有一些实现.我不想担心如果Giraffe没有实施说话 - 通过扩展已经有最小例程定义的动物,通过合同我保证有一些我可以使用的实现.

您也可以使用接口完成此操作,但是有些情况下接口不如扩展,因为接口要求所有实现类都有自己的实现,这在很多情况下是浪费时间.

这让我想到了第二个答案:简单.

你说(释义)'如果所有对象都必须实现说话而且所有人都说不同'.这是一个很大的假设.如果90%的动物说话相同而只有一些动物说话不同怎么办?想想Monkey,Human,Cat,和Telepathic Cat.在这里,我可能会争辩说前三个会说同样的话.唯一需要自己说话的人是Telepathic Cat因为它使用不同的方法来说话.在这种情况下,它定义的有用只说两次.一次进入Animal和第二次在特殊情况下Telepathic Cat.这使代码维护变得更加简单.如果每个人的说话都是真正不同的话,那么也许你想要一个界面,但如果大多数动物都说同样的话,那么继承就赢得了胜利.