簡體   English   中英

抽象類與接口

[英]Abstract class Vs Interface

抽象類與接口相同,只是它是一個實際類,而不僅僅是合同。 為什么接口被稱為合同?

接口和抽象類都是契約,因為它們綁定了您。

但是接口和抽象類之間還有其他區別。

就像您說的那樣,如果您需要一個實際的類,該類具有函數的內容或具有默認值的實際數據成員或ctor,那么顯然您將需要一個抽象類。

但是很多時候,接口還是抽象類之間的選擇在技術上都是相同的。 甚至從長遠來看,有時也會一樣。

然后,您的決定應基於所尋找內容的性質

它是數據類型的額外字符嗎? 還是定義您的數據類型什么?

我嘗試過考慮任何真實的示例,但是由於多年以來我都沒有做任何事情,所以找不到任何示例,因此我將為您提供一個類似書的示例。

假設我們有一個抽象類Animal:

public abstract class Animal
{
    abstract string Name;
    abstract bool IsWild;
    abstract bool IsHappy;
}

這本來可以是一個接口。

選擇它作為接口實際上不會對您的設計產生任何負面影響。

但是就其性質而言,它必須是抽象類,因為class Dog 動物。 它必須是class Dog : Animal class Dog : IAnimal而不是class Dog : IAnimal

做動物不是Dog的額外特征。 定義了什么。

並且您希望限制所有動物僅從Animal繼承。

IAnimal讓某人繼承其他東西。 喜歡:

public class Dog : Food, IAnimal {}

有趣的是,有時可能為了同一件事而寫一無所有的抽象類。

例如,如果沒有任何Animal共同財產,您仍然會喜歡:

public abstract class Animal { }

public class Dog : Animal // No actual added value.
{ 
        .........
}

抽象類與接口是同一件事不正確。 接口未定義方法主體,私有方法,靜態字段/方法等。

抽象方法可以是私有方法,因此不能保證可以被外界訪問,接口實現必須公開接口方法,從而“保證”此類方法的存在和可訪問性,因此稱為合同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM