[英]Specify implement interface on derived class when base class implements it abtract
[英]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.