[英]Abstract Class and Interface in C#
我從某個站點閱讀了一篇文章,在該文章中,我讀到了以下內容:
抽象類可以添加更多功能,而不會破壞使用舊版本的子類。 在接口中,由於必須對類實現接口方法,因此創建其他函數將對其子類產生影響。
我不明白這是什么意思。 誰能用一個好榜樣 更具體地解釋這一點 ?
這是我閱讀的文章鏈接
因為接口僅定義類型必須實現的成員,所以將任何新成員添加到接口將破壞實現舊版本的任何類,因為它固有地不實現新成員。 每次更改接口的定義時,都必須更改實現該接口的每個類。 將抽象成員添加到抽象類中對派生類也是如此,但是如果將虛擬成員添加到抽象類中,則對派生類沒有影響。 可以更改它們以覆蓋該成員,但不必這樣做。
這意味着如果您考慮一個名為Phone的抽象類,它具有3個虛函數,即AddPhonePrice,AddAccessoryPrice,AddAuxillaryPrice
以及是否有兩個子類1)SamsungPhone 2)Iphone
現在,三星手機將實現所有這三個功能。 而Iphone僅可用於AddPhonePrice,因為它們不提供電話其他功能
如果我們使用AddPhonePrice,AddAccessoryPrice和AddAuxillaryPrice函數創建名為IMainPhone的接口
那么SamsungPhone和Iphone都將需要實現所有這三個功能,而不管它們是否需要。
這意味着您可以將新成員(方法,屬性,字段等)添加到抽象類中,而這些新類不會導致派生類發生更改-只要成員不是抽象,這是正確的。 例如,考慮以下示例:
internal abstract class MyBaseClass
{
public abstract void DoSomething();
// This method can also be added later without having an effect on the derived classes
public virtual void DoSomethingElse()
{
// Do something else...
}
}
internal class MyDerivedClass : MyBaseClass
{
public override void DoSomething()
{
// Do something...
}
}
在這種情況下,派生類必須實現DoSomething
方法。 但是您可以稍后將非抽象函數添加到抽象基類中。 但是,將另一個抽象成員添加到基類后,這也將影響所有非抽象派生類,因為必須實現新成員。
另一方面,接口根本不定義具體的實現,而僅包含所有實現者必須提供的抽象簽名。 因此,如果將新成員(方法,屬性)添加到接口,則會強制該接口的所有實現者也提供新成員的實現。
接口:將方法添加到基本接口類時,必須(手動)確保所有派生類都實現該方法。
抽象基類:將方法添加到抽象基類時,編譯器不需要在派生類中實現該方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.