不能被密封,因为它不是覆盖

本文关键字:覆盖 因为 密封 不能 | 更新日期: 2023-09-27 18:06:22

我有以下类:

namespace Warnings
{
    public abstract class BaseWarningIntField : IWarningInnerDataField
    {
        public string PropName;
        public string HeaderCaption;
        public sealed WarningInnerDataType DataType
        {
            get { return WarningInnerDataType.Integer; }
        }
    }
}

我希望最后一个属性DataType不能被重写,因为它是Integer类型的警告细节字段的基类,所以它需要始终返回正确的类型WarningInnerDataType.Integer

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

Warnings.BaseWarningIntField。数据类型'无法密封,因为它不是覆盖

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

不能被密封,因为它不是覆盖

C#中,默认所有方法都是非虚拟的。你不能在子类中重写非虚方法。所以像往常一样保留属性可以避免子类重写它。

Sealed是类声明中用于继承限制的关键字,或用于停止类层次结构中成员的虚拟链。但同样,这与虚方法和属性有关。

试图在子类中重写"normal"属性将导致编译错误

WarningIntField.DataType。不能重写inherited"BaseWarningIntField.DataType成员。得到,因为它不是标记为虚拟、抽象或覆盖

为了回答你的评论,我将提供一些代码示例来说明我的观点。实际上,您不能限制派生类隐藏方法或属性。所以下一种情况是合法的,没有办法克服它(这与虚拟方法和以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;}
}

同样,你不能通过局部变量来限制隐藏类中的字段,所以这种情况也是有效的。请注意,编译器还将帮助您注意到,您正在通过局部变量隐藏类字段。这也与readonlyconst和简单的static字段有关。

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