[英]Sealed keyword in association with override
是否總是需要在如下代碼的方法簽名中跟隨sealed
關鍵字和override
:
public sealed override string Method1(){.....}
我的意思是,如果我想在基類中“密封”方法而不覆蓋,是否仍然需要override
關鍵字?
密封一個方法只有在你覆蓋它時才有意義。
這里發生的事情如下:
您正在覆蓋基類中的方法 ( override
) 並告訴編譯器不再允許從您的類派生的類覆蓋此方法 ( sealed
)。
如果該方法是您在您的類中聲明的新方法,並且您希望防止派生類覆蓋它,則不要將其聲明為虛擬方法。
如果該方法是在基類中聲明的,但不是可覆蓋密封的,那么它就沒有任何意義,因為它已經無法被覆蓋。
我認為 Hilgarth 先生在這里提供了最好的答案,但只是為了為以前有Java背景的程序員(比如我自己)添加一些新內容,我認為大多數 C# 新手,傾向於混淆sealed
和final
in Java
壓倒一切。
be in its derived classes.在Java中,不指定"any"
修飾符的默認行為是該方法在其派生類中被。
be unless explicitly specified using the virtual
keyword.而在C#中,默認行為是除非使用virtual
關鍵字明確指定,否則該方法。
希望這有助於補充上面的最佳答案。
是否總是需要在方法的簽名中使用override
跟隨sealed
關鍵字,如下面的代碼:
public sealed override string Method1(){.....}
我的意思是,如果我想在不覆蓋的情況下“密封”基類中的方法,是否仍然需要override
關鍵字?
好吧,這在技術上是可能的……但是,我的選擇是解決方案有點臟。
想象一下有一個A
類(在您的代碼庫或外部庫中):
public class A
{
public virtual void M () { /* implementation */ }
}
您可以定義一個(抽象)類B: A
,如下所示:
public class B : A
{
public sealed override void M() => base.M();
}
任何類C: B
都無法覆蓋AM
,因為您已經密封了該方法(即使您沒有進行任何語義更改)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.