![](/img/trans.png)
[英]Prevent calling base class implemented interface method in the derived class C#
[英]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.