簡體   English   中英

無法密封,因為它不是覆蓋

[英]Cannot be sealed because it's not an override

我有以下課程:

namespace Warnings
{
    public abstract class BaseWarningIntField : IWarningInnerDataField
    {
        public string PropName;

        public string HeaderCaption;

        public sealed WarningInnerDataType DataType
        {
            get { return WarningInnerDataType.Integer; }
        }
    }
}

我希望最后一個屬性DataType不可覆蓋,因為它是Integer類型的warning-detail字段的基類,所以它需要始終返回正確的類型WarningInnerDataType.Integer

無論如何,編譯器給我以下錯誤:

'Warnings.BaseWarningIntField.DataType'無法密封,因為它不是覆蓋

但是,據我所知, override與我想要實現的完全相反。

C# ,默認情況下所有方法都是非虛擬的。 您不能覆蓋子類中的非虛方法。 因此,像往常一樣離開財產將使您免受子類覆蓋它的影響。

Sealed是繼承限制的類聲明中使用的關鍵字,或用於停止類層次結構的成員的虛擬鏈。 但同樣 - 這與虛擬方法和屬性有關。

試圖覆蓋子類中的“普通”屬性將導致編譯錯誤

'WarningIntField.DataType.get':無法覆蓋繼承的成員'BaseWarningIntField.DataType.get',因為它未標記為虛擬,抽象或覆蓋

為了回答你的評論,我將提供一些代碼示例來說明我的觀點。 實際上,您無法限制派生類隱藏方法或屬性。 所以下一個情況是合法的,沒有辦法克服它(這與用new關鍵字表示的虛方法和方法有關)

class BaseClass
{
    public string Property {get; set;}
}

class DerivedClass : BaseClass
{
    //compiler will give you a hint here, that you are hiding a base class prop
    public string Property {get; set;}
}

同樣地,您不能限制通過局部變量隱藏類中的字段,因此這種情況也是有效的。 請注意,編譯器還可以幫助您注意,您正在通過局部變量隱藏類字段。 這也與readonly const和簡單的static字段有關。

int field = 0; //class field
void Foo()
{
    int field = 0; //local variable
}

暫無
暫無

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

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