簡體   English   中英

C#中的抽象類和接口

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

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