gpt4 book ai didi

C#接口(interface)和继承问题

转载 作者:太空狗 更新时间:2023-10-29 22:34:14 27 4
gpt4 key购买 nike

我正在学习 C#(C++ 背景),并且遇到了这段代码:

public interface IUndoable { void Undo(); }
public class TextBox : IUndoable
{
void IUndoable.Undo() { Console.WriteLine ("TextBox.Undo"); }
}

public class RichTextBox : TextBox, IUndoable
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}

既然 RichTextBox 派生自 TextBox,谁能解释为什么 RichTextBox 也派生自 IUndoable?。我本以为 IUndoable 接口(interface)将与 RichTextBox 有权访问的任何其他 TextBox 成员一起“继承”?

顺便说一句,根据我目前所读的内容,我猜测 C# 中不存在公共(public)、 protected 和私有(private)继承的概念。

这是正确的推论吗?如果是这样,如何在 C# 中实现这种行为(即限制继承)?

[编辑]

澄清:我正在阅读的书中的部分是关于隐式和显式接口(interface)实现的细微差别和潜在陷阱 - 所以我明白了。此外,代码片段(从书中复制)是故意冗长的,以便解释由于调用在基类中隐式实现的重新实现的成员方法而产生的不同语义(呸!)。

我的主要问题可以简单概括为:

可以这样吗:

public class RichTextBox : TextBox, IUndoable
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}

写成:

public class RichTextBox : TextBox
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}

如果是,为什么作者要冗长(我敢肯定他一定有理由)。如果不是,为什么不从 TextBox 继承接口(interface)?

最佳答案

在 C# 中,对于类,只有 C++ 中的公共(public)继承。

但是,您可以显式隐式 实现接口(interface)。 TextBox 显式实现 IUdoable,这就是为什么你有

void IUndoable.Undo() 

而不是简单地

void Undo() 

在您的 TextBox 类中。显式实现接口(interface)时,您只能通过显式强制转换访问对象上接口(interface)的方法:

TextBox tb = new TextBox();
tb.Undo(); // error
((IUndoable)tb).Undo(); // ok

正如您所说,接口(interface)是“继承的”,但是 RichTextBox 隐式地重新实现了 IUndoable,因此您不需要转换来访问接口(interface)的方法:

RichTextBox rtb = new RichTextBox();
rtb.Undo(); // ok

关于C#接口(interface)和继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6041031/

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