【发布时间】:2018-02-22 04:26:41
【问题描述】:
在浏览一些遗留代码时,我惊讶地发现抽象覆盖本身就是抽象的成员。基本上是这样的:
public abstract class A
{
public abstract void DoStuff();
}
public abstract class B : A
{
public override abstract void DoStuff(); // <--- Why is this supported?
}
public abstract class C : B
{
public override void DoStuff() => Console.WriteLine("!");
}
虚拟或抽象成员之间的区别不是总是可供编译器使用吗?为什么 C# 支持这个?
(这个问题不是What is the use of 'abstract override' in C#? 的重复,因为A 类中的DoStuff-方法也不是虚拟的,而是抽象的。)
【问题讨论】:
-
在你的例子中
DoStuff method在类A中是抽象的,所以抽象覆盖在B类中没有意义,也没有必要,当 DoStuff 在类 @987654330 中时它是有意义的@ 是虚拟的,因此您可以将其设为“抽象覆盖”以强制类C实现它 -
我知道抽象覆盖没有意义。我要问的是为什么 C# 首先支持它。 (我想知道它是否有我不知道的附加值)
-
我不认为这是一个骗局。问题不是为什么抽象覆盖是合法的,而是为什么覆盖抽象的抽象是合法的。