簡體   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