What is the use of 'abstract override' in C#?
出于好奇,我尝试重写基类中的抽象方法,并使用方法实现抽象。如下:
1 2 3 4 5 6 7 8 9 10 | public abstract class FirstAbstract { public abstract void SomeMethod(); } public abstract class SecondAbstract : FirstAbstract { public abstract override void SomeMethod(); //?? what sense does this make? no implementaion would anyway force the derived classes to implement abstract method? } |
想知道为什么C编译器允许写"抽象重写"。这不是多余的吗?应该是一个编译时错误来执行类似的操作。它是否适用于某些用例?
谢谢你的关心。
在MicrosoftDocs上有一个很有用的例子——基本上你可以强制派生类为一个方法提供一个新的实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class D { public virtual void DoWork(int i) { // Original implementation. } } public abstract class E : D { public abstract override void DoWork(int i); } public class F : E { public override void DoWork(int i) { // New implementation. } } |
If a virtual method is declared abstract, it is still virtual to any
class inheriting from the abstract class. A class inheriting an
abstract method cannot access the original implementation of the
method—in the previous example, DoWork on class F cannot call DoWork
on class D. In this way, an abstract class can force derived classes
to provide new method implementations for virtual methods.
我发现它对于确保派生类中正确的
1 2 3 4 | public abstract class Base { public abstract override string ToString(); } |
对于实现人员来说,这是一个明确的信号,即
有趣的是,C编译器的Roslyn版本中有一个抽象的重写方法,我觉得这很奇怪,可以写一篇关于以下内容的文章:
假设
在这种情况下,由于
一般来说,由
因此:
- 两者都不是关键字:"简单"方法
- 仅限
abstract :派生类必须实现 - 仅限
override :基类中定义的方法的实现 abstract override :派生类必须实现在基类中定义的方法
这种设计模式称为模板方法模式。
关于模板方法的维基百科页面
一个简单的、非软件的例子:有很多军事单位:坦克、喷气机、士兵、战舰等。他们都需要实现一些通用的方法,但他们将以非常不同的方式实现这些方法:
- MOVEL()
- 攻击()
- 后退()
- REST()
等。。。
如果在
希望这有帮助…
这样做是因为在子类中,不能使用与基类中同名的
希望这就是你要找的。