无法密封,因为它不是覆盖

Tee*_*jay 12 c# overriding sealed

我有以下课程:

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

        public string HeaderCaption;

        public sealed WarningInnerDataType DataType
        {
            get { return WarningInnerDataType.Integer; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望最后一个属性DataType不可覆盖,因为它是Integer类型的warning-detail字段的基类,所以它需要始终返回正确的类型WarningInnerDataType.Integer.

无论如何,编译器给我以下错误:

'Warnings.BaseWarningIntField.DataType'无法密封,因为它不是覆盖

但是,据我所知,override这与我想要实现的完全相反.

Ily*_*nov 22

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;}
}
Run Code Online (Sandbox Code Playgroud)

同样地,您不能限制通过局部变量隐藏类中的字段,因此这种情况也是有效的.请注意,编译器还可以帮助您注意,您正在通过局部变量隐藏类字段.这也与readonly const简单static领域有关.

int field = 0; //class field
void Foo()
{
    int field = 0; //local variable
}
Run Code Online (Sandbox Code Playgroud)

  • 从[MSDN](http://msdn.microsoft.com/en-us/library/88c54tsw(v = vs.110).aspx):_您还可以在覆盖虚方法的方法或属性上使用sealed修饰符或基类中的财产.这使您可以允许类从您的类派生,并防止它们覆盖特定的虚拟方法或属性._ (4认同)