Kev*_*tle 5 java oop inheritance
我无法理解何时/为什么要实现继承以及何时/为什么要通过接口实现继承.请耐心等待我解释..
比方说,我们有一个父类Animal,我们希望把它与3子类延伸:Dog,Cat和Mouse.
假设所有的动物都能够eat(),sleep(),scratch()和move().并且Dog能够pant().有了这些知识,我们将着手进行第一轮4周的行为增加了Animal超类和有Dog,Cat和Mouse扩展Animal.我们也会把这个方法添加pant()到Dog班级,因为只有狗pant().
现在,如果我们希望添加另一个名为方法会发生什么waggleTail(),但只有Cat和Dog出现此行为.我们不能将此行为添加到AnimalBEC那么Mouse也将继承行为(和鼠标不来回动它的尾巴).另一种方法是将方法添加waggleTail()到类Dog和Cat类中,但不添加到Mouse类中.然而,这种方法没有意义,因为我们会通过waggleTail()两次编写方法来违反DRY原则(不要重复自己).我们想要编写每个方法一次,并且只编写一次.
也许我们可以通过创建一个从Animal被调用继承的新子类来解决这个问题TailWagglingAnimal,将该方法添加waggleTail()到这个子类然后同时拥有Dog并Cat继承这个新的子类.这听起来很合理,直到你意识到还有其他几十个这样的异常,我们必须一次又一次地重复这个过程(这会将继承层次结构扩展到无止境).
此外,如果我们有一种特殊的Dog(让我称之为"Coton de Tulear")展示所有其他行为Dog(如气喘吁吁),除了它不会摆动它的尾巴.如果我们有"Coton de Tulear"直接继承Animal它将无法喘气().如果我们从它继承Dog它将能够摇摆它的尾巴(bec Dog延伸TailWagglingAnimal).如果我们直接Dog扩展Animal然后创建一个名为TailWagglingDog(如同TailWagglingAnimal)的新子类,那么Cat将无法继承此行为(因此我们需要复制Cat层次结构中某些违反DRY原则的行为).
我们做什么?
基于stackoverflow上的几十个线程(以及几个OO设计书籍),建议waggleTail()从Dog类中删除该方法并将其添加到接口.让我们调用界面 TailWaggler,然后让所有的狗("Coton de Tulear"除外)实现这个界面.但是,我无法理解为什么/如何有用.
如果你考虑一下,这意味着所有50多只狗的面包(我们假设有50个面包需要表现出这种行为)需要添加implements TailWaggler关键字,因为单一种类Dog不会出现这种行为.这不仅意味着程序员的大量额外手工工作(TailWaggler 在每个类的开头添加工具),这意味着所有后代都需要关注他们展示的行为的所有细节和细节(这个如果我们将此行为添加到父类并扩展父类,则不会是这种情况.如果我们只有少数这样的情况,这可能没问题,但如果我们有几十个或几百个这样的情况呢?最后,当我们添加类型为dog的新类型的子类时,最终将会有一种Dog不会表现出Dog父类的行为之一 - 所以这意味着缓慢但肯定我们需要删除几乎所有的行为(父)Dog类并将它们添加到接口?然后我们需要确保所有子类都实现了许多不同的接口.有人可能会建议我们将所有相关行为分组到一个界面中,但这只有在不同的狗表现出来的行为是统一的情况下才有可能 - 如果不是这样的情况怎么办?)
谢谢!
对一个长问题的简短回答,所以在其他有更多精力的人加入之前不要接受这一点。但我将如何做到这一点是拥有一个实现 TailWagger 接口的抽象 Dog 类,并具有具体的 tailWag 函数。
接下来让你所有的狗都继承 Dog,包括那些实际上不摇摆的狗。然后在该特定的狗实现中,创建一个名为 tailWag 的新具体函数,该函数会抛出类似于 InvalidStateException("This type of dogs does not wag its tail") 的异常。
使用这种方法,您可以得到一种摇尾巴的具体“tailWag”,以及一种行为不同的特殊情况。