12

我有以下课程:

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

        public string HeaderCaption;

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

我希望最后一个属性DataType不可覆盖,因为它是整数类型的警告详细信息字段的基类,因此它需要始终返回正确的类型WarningInnerDataType.Integer

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

'Warnings.BaseWarningIntField.DataType' 不能被密封,因为它不是覆盖

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

4

1 回答 1

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;}
}

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

int field = 0; //class field
void Foo()
{
    int field = 0; //local variable
}
于 2013-03-27T15:52:48.173 回答