[英]Preventing a C# subclass from overwriting a method
假設我有一個名為“Parent”的抽象父類,它實現了一個名為“DisplayTitle”的方法。 我希望這個方法對於繼承“Parent”的每個子類都是相同的 - 如果子類試圖實現它們自己的“DisplayTitle”方法,我想要編譯錯誤。 我怎樣才能在C#中實現這一目標。 我相信Java,我只是將該方法標記為“最終”,但我似乎無法在C#中找到替代方案。 我一直在搞“密封”和“覆蓋”,但我無法得到我正在尋找的行為。
例如,在此代碼中:
using System;
namespace ConsoleApplication1
{
class Parent
{
public void DisplayTitle() { Console.WriteLine("Parent's Title"); }
}
class ChildSubclass : Parent
{
public void DisplayTitle() { Console.WriteLine("Child's Own Implementation of Title");
}
static void Main(string[] args)
{
ChildSubclass myChild = new ChildSubclass();
myChild.DisplayTitle();
Console.ReadLine();
}
}
}
我想收到一個編譯錯誤,說“ChildSubClass”不能覆蓋“DisplayTitle”。 我目前得到一個警告 - 但似乎這是我應該能做的事情,我不知道標記方法的正確屬性。
我怎樣才能在C#中實現這一目標。 我相信Java,我只是將該方法標記為“最終”,但我似乎無法在C#中找到替代方案。
粗略的等價物用C# sealed
,但通常只需要虛擬方法 - 而且你的DisplayTitle
方法不是虛擬的。
重要的是要注意ChildSubclass
不會覆蓋DisplayTitle
- 它隱藏了它。 任何僅使用對Parent
引用的代碼都不會最終調用該實現。
請注意,使用代碼按原樣,您應該收到編譯時警告,建議您將new
修飾符添加到ChildSubclass
的方法:
public new void DisplayTitle() { ... }
您不能阻止派生類隱藏現有方法,除了通過密封類本身以防止完全創建派生類...但是不直接使用派生類型的調用者將無關緊要。
你真正擔心的是什么? 意外誤用或故意問題?
編輯:請注意,示例代碼的警告類似於:
Test.cs(12,19): warning CS0108:
'ConsoleApplication1.ChildSubclass.DisplayTitle()' hides inherited
member 'ConsoleApplication1.Parent.DisplayTitle()'. Use the new keyword
if hiding was intended.
我建議你把警告變成錯誤,然后更難忽略它們:)
派生類不能覆蓋您的方法,您沒有將其聲明為虛擬 。 請注意,與Java相比,C#中的情況有很大不同,所有方法都是Java中的虛擬方法。 在C#中,您必須明確使用關鍵字。
派生類可以通過再次使用相同的名稱來隱藏您的方法。 這可能是您正在討論的編譯警告。 使用new關鍵字會抑制警告。 此方法不以任何方式覆蓋原始方法,基類代碼始終調用原始方法,而不是派生類中的方法。
使用sealed修飾符可以防止子類覆蓋您的類,屬性或方法。 使用密封時什么不起作用?
我很確定你想要的東西在C#中使用方法修飾符關鍵字是不可能的。
密封僅在覆蓋祖先類中的虛方法時適用,然后防止進一步覆蓋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.