为什么 abstract class 不能有 Sealed 方法
Why abstract class cannot have Sealed method
Code Snippet 1 (Compilation Error) - A.M2() cannot be sealed because it is not an override
abstract class A
{
public abstract void M1();
public sealed void M2()
{
// Do Something
}
}
Code Snippet 2 (Works Fine)
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
,为什么它要我在子中重写class,然后标记为密封。我无法理解这种差异
密封关键字只能放在可覆盖的函数上。
您指定的该函数未声明为虚函数,因此不可覆盖。此外,将函数声明为 "virtual" 和 "sealed" 没有任何意义,因为密封取消了 "virtual"
Sealed only 可以与 "override" 关键字一起使用,并阻止其他 类 覆盖函数本身。
它与 abstract
class 无关。在派生的 class.
中,您不能将方法设为密封的 class 方法
如果您打算限制它在派生 class 中被覆盖,那么您最好使用 private
访问修饰符。
以及为什么可以在派生中使用 sealed 的原因 class;我在下面有一个例子
您有三个 classes A,B,C
,其中 B
覆盖 A
并且 C
派生自 B
-> B:A, C:B
abstract class A
{
public abstract void MyMethod();
}
class B : A
{
public sealed override void MyMethod()
{
}
}
class C : B
{
public override void MyMethod()
{
}
}
在上面的例子中,我们可以覆盖 B
class 中 A
的方法,因为它不是密封的。但是,如果您在 class C
中覆盖 B
的方法,那么由于 sealed 关键字,它是不允许的。
它将限制来自 class B
的进一步覆盖。这就是我们可以使用 sealed
的地方
Code Snippet 1 (Compilation Error) - A.M2() cannot be sealed because it is not an override
abstract class A
{
public abstract void M1();
public sealed void M2()
{
// Do Something
}
}
Code Snippet 2 (Works Fine)
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
,为什么它要我在子中重写class,然后标记为密封。我无法理解这种差异
密封关键字只能放在可覆盖的函数上。 您指定的该函数未声明为虚函数,因此不可覆盖。此外,将函数声明为 "virtual" 和 "sealed" 没有任何意义,因为密封取消了 "virtual"
Sealed only 可以与 "override" 关键字一起使用,并阻止其他 类 覆盖函数本身。
它与 abstract
class 无关。在派生的 class.
如果您打算限制它在派生 class 中被覆盖,那么您最好使用 private
访问修饰符。
以及为什么可以在派生中使用 sealed 的原因 class;我在下面有一个例子
您有三个 classes A,B,C
,其中 B
覆盖 A
并且 C
派生自 B
-> B:A, C:B
abstract class A
{
public abstract void MyMethod();
}
class B : A
{
public sealed override void MyMethod()
{
}
}
class C : B
{
public override void MyMethod()
{
}
}
在上面的例子中,我们可以覆盖 B
class 中 A
的方法,因为它不是密封的。但是,如果您在 class C
中覆盖 B
的方法,那么由于 sealed 关键字,它是不允许的。
它将限制来自 class B
的进一步覆盖。这就是我们可以使用 sealed