C# 派生自实现接口的基类
我从第23项得到以下代码应打印:C# 派生自实现接口的基类,c#,C#,我从第23项得到以下代码应打印:MyDerivedMessage namespace ConsoleApplication1 { interface IMsg { void message(); } public class MyMessage : IMsg { public void message() { Console.WriteLine("MyMessage");
MyDerivedMessage
namespace ConsoleApplication1
{
interface IMsg
{
void message();
}
public class MyMessage : IMsg
{
public void message()
{
Console.WriteLine("MyMessage");
}
}
public class MyDerivedMessage : MyMessage
{
public new void message()
{
Console.WriteLine("MyDerivedMessage");
}
}
class Test
{
static void Main()
{
MyDerivedMessage mdm = new MyDerivedMessage();
IMsg im = mdm as IMsg;
im.message();
}
}
}
书籍:
添加IMsg关键字会更改派生对象的行为
类,以便IMsg.Message()现在使用派生类版本:
MyDerivedClass d = new MyDerivedClass();
d.Message(); // prints "MyDerivedClass".
IMsg m = d as IMsg;
m.Message(); // prints " MyDerivedClass "
为什么我在MyDerivedMessage::message()
中添加了“new”(新建)之后仍然打印MyMessage
?您是在隐藏(或隐藏)该方法,而不是覆盖它。这意味着您只能在从声明为派生类(或更多派生类)的变量访问派生类时调用该方法
请注意,这是非虚拟方法的默认值,因此添加“new”更显式
如果不希望出现这种行为,则需要在基类中使消息
方法虚拟,并在派生类中重写它
另请参见上的文档。这本书似乎有一些勘误表,但您的MyDerivedMessage类也需要实现IMsg。如果没有发生这种情况,则在调用im.Message()时,对IMsg的转换只会将MyMessage视为具有Message()方法,因为接口和MyDerivedMessage之间创建了链 MyDerivedMessage是一条MyMessage MyMessage是一个IMsg MyDerivedMessage不是IMsg
public class MyDerivedMessage : MyMessage, IMsg
{
public new void message()
{
Console.WriteLine("MyDerivedMessage");
}
}
是的,虚拟和覆盖的第二部分我已经完成了,但是我不明白为什么书上说它会打印派生的消息。我不熟悉那本书,但只有两个选择:1)书中有错误,或者2)你误解了书中的那一部分。如果你使用了与书中相同的代码,并且它声称输出应该不同,那么这本书就有一个错误。是的,这本书有一个错误-检查勘误表页面是否有有效的c#这里:它解决了你正在阅读的部分。这不是我在电脑书或一般书中看到的第一个错误(打字错误)!谢谢你指出错误。所以我毕竟没有疯:)
public class MyDerivedMessage : MyMessage, IMsg
{
public new void message()
{
Console.WriteLine("MyDerivedMessage");
}
}