[英]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.