C# 派生自实现接口的基类

C# 派生自实现接口的基类,c#,C#,我从第23项得到以下代码应打印:MyDerivedMessage namespace ConsoleApplication1 { interface IMsg { void message(); } public class MyMessage : IMsg { public void message() { Console.WriteLine("MyMessage");

我从第23项得到以下代码应打印:
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"); 
    } 
}