簡體   English   中英

在Base類中聲明的C#接口方法不需要在Derived類中再次實現

[英]C# interface method declared in Base class need not be again implemented in Derived class

這可能是一個愚蠢的問題,但我正在學習,我只是好奇發生了什么,今天我玩的是幾個oops概念並在VS中學習它。 我再次感到困惑的是,我們不必在派生類中實現多個接口相同的方法,其中ACTUALLY我們“繼承”接口,但是在基類中。

我可以知道它是如何工作的嗎? 我擔心的是,即使我沒有在基類中“繼承”接口方法,我也使用同名的方法。 我也沒有在派生類中實現它。

有人可以幫我理解發生了什么以及如何以及為什么?

Class A
{
    public void Display()
    {
        Console.Writeline("I am from A");
    }
}

interface IA
{
    void Display();
}

interface IB
{
    void Display();
}

Class B : A, IA, IB
{

}

Class Final
{
    static void Main()
    {
        B b = new B();
        b.Display(); // displays class A Display method.
        Console.Readline();
    }
}

原因是因為實現是“隱含的” - 接口的隱式實現。

Class A
{
 public void Display()
 {
     Console.Writeline("I am from A");
 }
}

interface IA
{
 void Display();
}

interface IB
{
 void Display();
}

Class B : A, IA, IB
{
  void AI.Display() { Console.Writeline("I am from AI.Display"); }
}

Class Final
{
 static void Main()
 {
   B b = new B();
   b.Display(); // displays class A Display method.
   (b as IB).Display(); // displays class A Display method.
   (b as AI).Display(); // displays AI.Display
   Console.Readline();
 }
}

上面的示例現在具有接口方法顯示的顯式實現。 請注意方法簽名的輕微變化 - 這是您聲明顯式實現的方式,該實現在對象由接口表示時特別使用,在本例中為(b as AI)

否則,如果方法簽名匹配,則自動(隱式)使用它作為接口的方法。

雖然我不能代表語言團隊發言,但您可以通過提出替代解決方案來回答這個問題。

您想知道為什么B被認為是實現接口IA即使所需的方法定義在基類A ,它沒有實現接口。 所以,讓我們考慮相反的情況: 應該考慮使用B來實現接口,因為基類的方法並沒有考慮到該接口。

這意味着您的代碼無法編譯。 為什么不編譯? 因為B沒有實現接口IA所需的成員Display

要解決此問題,您需要向B類添加方法Display 這修復了接口實現。 但是,您現在遇到了一個新的編譯問題:您將看到一個警告“B.Display()'隱藏繼承成員'ConsoleApplication1.A.Display()'。如果要隱藏,請使用new關鍵字。”

這是因為您的A.Display無法覆蓋 - 而且您不想覆蓋它。 如果你選擇的話,你可以實現一個調用base.Display()的方法,但是這是額外的代碼,基本上什么都不做,而且它會使你的繼承變得混亂,因為new方法的處理方式不同於覆蓋。 (如果您編寫A x = new B(); x.Display();那么您實際上會直接調用A.Display() ,這可能會因為您的代碼發展而變得混亂,並且是一個等待發生的事故。)

或者,您可以實現一個全新的B.Display方法。 你現在所做的是隱藏A類中實現的方法,任何可能從B派生或創建B實例的人。 使用new來隱藏方法很少是可理解的對象結構的一個配方,這也不例外 - 所有這些都可以讓你干凈地實現一個接口。

所以最終,我想,這個決定是因為替代方案過於混亂。

在你的情況下發生的事情是,B類通過從A類繼承適當的IA方法實現這一事實來滿足IA接口契約。

查看它的方法是 - 接口是契約 (它沒有實現)因此它只是要求任何實現類定義它在契約中定義的所有相同成員。

在你的情況下,你的接口Display有1個方法,你的類B是實現這個接口的唯一類,它沒有顯式定義Display的實現(也許這就是你的困惑)。 但是,它繼承自A確定了它的實現,因此B默認實現接口。

暫無
暫無

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

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