![](/img/trans.png)
[英]Why to use Interfaces, Multiple Inheritance vs Interfaces, Benefits of Interfaces?
[英]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
类的。 它们分别是WildAnimal
和TameDog
类型。
如果我们以其他方式完成此操作,则我们的代码将读取完全不同的内容。 我们只能启动一个类,即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.