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