簡體   English   中英

派生自實現接口的基礎 class

[英]Derived from a base class that implements an interface

我從Effective C#項目 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();
        }
    }
}

書:

public class MyDerivedClass : MyClass
{
    public new void Message()
    {
        Console.WriteLine("MyDerivedClass");
    }
}

添加 IMsg 關鍵字會更改派生的 class 的行為,因此 IMsg.Message() 現在使用派生的 class 版本:

MyDerivedClass d = new MyDerivedClass();
d.Message(); // prints "MyDerivedClass".
IMsg m = d as IMsg;
m.Message(); // prints " MyDerivedClass "

在將“new”添加到MyDerivedMessage::message()之后,為什么我仍然會打印MyMessage

您正在隱藏(或隱藏)該方法,而不是覆蓋它。 這意味着當您從聲明為 class(或更多派生)的變量訪問它時,您只會調用派生 class 上的方法。

請注意,這是非虛擬方法的默認設置,因此添加“新”只是更加明確。

如果您不希望這種行為,您需要在您的基礎 class 中使message方法虛擬,並在派生的 class 中覆蓋它。

另請參閱有關new Modifier的文檔

看起來這本書可能有一些勘誤表,但您的 MyDerivedMessage class 也需要實現 IMsg。 如果這沒有發生,那么由於接口和 MyDerivedMessage 之間創建的鏈,當調用 im.message() 時,轉換為 IMsg 只會看到 MyMessage 具有 Message() 方法。

MyDerivedMessage is-a MyMessage MyMessage is-a IMsg MyDerivedMessage NOT is-a IMsg

public class MyDerivedMessage : MyMessage, IMsg
{ 
    public new void message() 
    { 
        Console.WriteLine("MyDerivedMessage"); 
    } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM