【发布时间】:2018-06-19 06:14:31
【问题描述】:
代码片段 1(编译错误)- A.M2() 不能被密封,因为它不是覆盖
abstract class A
{
public abstract void M1();
public sealed void M2()
{
// Do Something
}
}
代码片段 2(工作正常)
abstract class A
{
public abstract void M1();
public virtual void M2()
{
}
}
class B : A
{
public sealed override void M1()
{
}
public sealed override void M2()
{
}
}
问题 - 如果我在 Abstract class 本身中提供方法的实现,为什么 C# 不允许我标记它Sealed,为什么它要我在子类中覆盖,然后标记它作为密封。我无法理解这种差异
【问题讨论】:
-
方法默认是
sealed,如果它们没有被声明为虚拟并且没有覆盖另一个虚拟方法。因此,如果您在基类本身中提供实现,并且您不希望派生类覆盖该方法,则不必将它们标记为virtual,仅此而已。 -
This 可能会让事情变得清晰
-
@sthotakura 方法默认是不密封的,因为新的实现可以在子类中,它隐藏了旧的,没有任何编译错误
-
@MrinalKamboj 隐藏具有
new实现的方法与override实现不同。除非在基类中将其标记为virtual,否则您无法覆盖该方法。 -
什么意思?当然,您可以将抽象类中的方法标记为密封的。像这样:
public abstract class Z { public virtual void M() { } } public abstract class A : Z { public sealed override void M() { } }
标签: c# oop abstract-class sealed