gpt4 book ai didi

在 Base 类中声明的 C# 接口(interface)方法不需要在 Derived 类中再次实现

转载 作者:行者123 更新时间:2023-11-30 13:57:43 26 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但我正在学习,我只是好奇发生了什么,今天我在玩一些 oops 概念并在 VS 中学习它。我再次感到困惑,因为我们不必在派生类中实现多个接口(interface)相同的方法,实际上我们“继承”了接口(interface),但在基类中。

我可以知道它是如何工作的吗?我担心的是,即使我没有“继承”基类中的接口(interface)方法,我也使用了同名的方法。我也不在派生类中实现它。

有人可以帮助我了解正在发生的事情以及发生的方式和原因吗?

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();
}
}

最佳答案

虽然我不能代表语言团队发言,但您可以通过提出替代解决方案来回答这个问题。

您想知道为什么 B 被认为实现了接口(interface) IA,即使所需的方法定义在基类 A 中,它不实现接口(interface)。因此,让我们考虑相反的情况:B 应该 被认为是实现接口(interface),因为基类的方法在编写时并没有考虑到该接口(interface)。

这意味着您的代码无法编译。为什么不编译?因为 B 没有实现接口(interface) IA 所需的成员 Display

要解决此问题,您需要向类 B 添加一个方法 Display。这修复了接口(interface)实现。但是,您现在遇到了一个新的编译问题:您会看到警告“B.Display()”隐藏了继承的成员“ConsoleApplication1.A.Display()”。如果要隐藏,请使用 new 关键字。

这是因为您的 A.Display 不可覆盖 - 您不想覆盖它。如果您愿意,您可以实现一个调用 base.Display() 的方法,但这是基本上什么都不做的额外代码,并且自从 new 方法的处理方式与覆盖不同。 (如果你写 A x = new B(); x.Display(); 那么你实际上会直接调用 A.Display(),这可能会变得困惑您的代码在不断发展,并且是一个等待发生的事故。)

或者,您可以实现一个全新的 B.Display 方法。您现在还对可能从 B 派生或创建 B 实例的任何人隐藏了在类 A 中实现的方法。使用 new 来隐藏方法很少是可理解的对象结构的秘诀,这也不异常(exception) - 所有这些都是为了您可以干净地实现接口(interface)。

所以最终,我想,做出这个决定是因为替代方案太困惑了。

关于在 Base 类中声明的 C# 接口(interface)方法不需要在 Derived 类中再次实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19910342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com