簡體   English   中英

防止C#子類覆蓋方法

[英]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修飾符可以防止子類覆蓋您的類,屬性或方法。 使用密封時什么不起作用?

http://msdn.microsoft.com/en-us/library/88c54tsw.aspx

我很確定你想要的東西在C#中使用方法修飾符關鍵字是不可能的。

密封僅在覆蓋祖先類中的虛方法時適用,然后防止進一步覆蓋。

暫無
暫無

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

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