繁体   English   中英

为什么在多重继承而不是在接口中发生歧义

[英]why ambiguity happens in multiple inheritance not in interfaces

我们如何在接口中实现歧义? 我们不能使用抽象类来实现歧义吗? 我认为抽象类也可以收集完全抽象的方法。 那为什么我们需要接口。

一个完全抽象的类和一个接口在表面上看起来是相同的,但是在启动时却有很大的不同。 采取以下措施:

public interface WildAnimal { ... }
public interface TamePet { ... }
public class Dog implements WildAnimal, TamePet { ... }

abstract class BadWildAnimal { ... } // fully abstract
abstract class BadTamePet extends BadWildAnimal{ ... } // fully abstract 
public abstract class BadDog extends BadTamePet { ... } // defines all methods of both BadAnimal and BadPet

在我的代码中,我有一只狗。 这只狗可以被野生或驯服对待,我可以将其传入和传出如下方法:

WildAnimal myDog = new Dog(); // I will treat this object as though it is a wild animal
TamePet trainedDog = trainMyDog(myDog); // I will treat this object as though it is a trained pet

protected Dog trainMyDog(Dog someDog) { ... }

我在这里说的是,我是从WildAnimal (在这种情况下,它是一只狗)开始的,我训练了这只狗,现在它变成了TamePet。 trainMyDog(Dog someDog)方法只知道它将trainMyDog(Dog someDog)狗。 它会对它有所帮助,然后还给狗。 呼叫者知道它将给它一只WildAnimal狗,并且会收回TamePet

在这里要知道的重要一点是, myDog对象只能查看和访问WildAnimal中定义的方法。 trainedDog对象只能看到并有权访问TamePet中定义的方法。 即使Dog实现了这两种方法,这些对象也只能对接口定义它们所定义的方法起作用。 这些对象不是Dog类的。 它们分别是WildAnimalTameDog类型。

如果我们以其他方式完成此操作,则我们的代码将读取完全不同的内容。 我们只能启动一个类,即BadDog类。 它既是BadWildAnimal类和BadTamePet的同时,不使逻辑意义。

该代码看起来也很奇怪:

BadDog myDog = new BadDog();
BadDog trainedDog = trainMyDog(BadDog someDog);

protected BadDog trainMyDog(BadDog someDog) { ... }

如果以后有人来阅读您的代码,或者如果您数年后又回去更新代码,那么上面的代码是没有意义的。 您可以尝试类型转换,但这样会变得更难阅读,并且传递对象变得很麻烦。 但是,如果使用接口,则很明显正在发生什么以及如何完成。

在这些示例中,接口使代码更易于阅读,并确保我正确使用了该对象。 Dog类中可能有一个名为biteTheMailman() ,但是如果在WildAnimal接口中定义了该WildAnimal ,则只有myDog对象可以做到这一点。 我将无法让我trainedDog做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM