我有以下课程:
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
与我想要实现的完全相反。
答案 0 :(得分:22)
C#
中的默认情况下,所有方法都是非虚拟的。您不能覆盖子类中的非虚方法。因此,像往常一样离开财产将使您免受子类覆盖它的影响。
Sealed
是继承限制的类声明中使用的关键字,或者用于停止类层次结构的成员的虚拟链。但同样 - 这与虚拟方法和属性有关。
尝试覆盖子类中的“normal”属性将导致编译错误
'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
}