voi*_*tar 5 c# inheritance interface
我正在学习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"); }
}
Run Code Online (Sandbox Code Playgroud)
由于RichTextBox派生自TextBox,任何人都可以解释为什么RichTextBox也来自IUndoable吗?我原以为IUndoable接口将与RichTextBox可以访问的任何其他TextBox成员"一起继承"?
顺便说一句,我猜测到目前为止我所读到的内容,C#中不存在公共,受保护和私有继承的概念.
这是正确的推论吗?如果是这样,那么在C#中如何实现这种行为(即限制继承)?
[编辑]
澄清:我正在阅读的书中的部分是关于隐式和显式接口实现的细微差别和潜在问题 - 所以我明白了.此外,代码片段(从本书中复制)是故意冗长的,以便解释由于调用在基类中隐式实现的重新实现的成员方法而导致的不同语义(phew!).
我的主要问题可简单归纳为:
可以这样:
public class RichTextBox : TextBox, IUndoable
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}
Run Code Online (Sandbox Code Playgroud)
写作:
public class RichTextBox : TextBox
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}
Run Code Online (Sandbox Code Playgroud)
如果是的话,为什么作者是冗长的(他必须有一个我确定的理由).如果不是,为什么接口不是从TextBox继承的?
在C#中,对于类,C++中只有公共继承的等价物.
但是,您可以显式或隐式地实现接口.TextBox明确地实现了IUdoable,这就是你拥有的原因
void IUndoable.Undo()
Run Code Online (Sandbox Code Playgroud)
而不是简单的
void Undo()
Run Code Online (Sandbox Code Playgroud)
在你的TextBox班上 显式实现接口时,只能通过显式转换访问对象上的接口方法:
TextBox tb = new TextBox();
tb.Undo(); // error
((IUndoable)tb).Undo(); // ok
Run Code Online (Sandbox Code Playgroud)
正如你所说,接口是"继承的",但RichTextBox隐式重新实现了IUndoable,因此你不需要使用强制转换来访问接口的方法:
RichTextBox rtb = new RichTextBox();
rtb.Undo(); // ok
Run Code Online (Sandbox Code Playgroud)
RichTextBox不必IUndoable明确指定。像 ReSharper 这样的工具甚至可能会告诉您这一点并提供删除服务。
并且 AFAIK 对继承没有限制,只是 \xe2\x80\x9cdefault\xe2\x80\x9d 继承。
\n\n如果你不希望人们从你的班级派生,那就创建它sealed。
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |