以下这段代码有编译错误:
{ void ShowExampe(string example); } public class DetailedExample : IExample { public void ShowExampe(string example) //Line 7 { //implementation detail } } public class BlogDetailedExample : DetailedExample { public override void ShowExampe(string example) //Line 14 { //My override } } 错误代码是CS0506: \\\\\\\'function1\\\\\\\' : cannot override inherited member \\\\\\\'function2\\\\\\\' because it is not marked "virtual", "abstract", or "override"。从此我们也许可以推断出第七行的ShowExample不是虚函数。实际上,它是虚函数,至少从IL代码可以看到virtual的标记: 但是我们注意到了final的使用,这使得此虚函数不可以再被override. 现在将第七行改成 public virtual void ShowExampe(string example) 则可以使得代码编译通过。此时其IL就和类自己定义的(而不是通过实现interface得到的)虚函数一样了: 当然我们也可以将类DetailedExample改成abstract(抽象)类也使得编译成功,这也和类自己定义的其他抽象函数一样。 public abstract class DetailedExample : IExample { public abstract void ShowExampe(string example); } ShowExample的IL代码如下: 所以编译器只是对于未使用virtual或者abstract的interface函数实现做了特别的处理,使得它是虚函数,但是final的函数实现所以不可以再被override. 回答标题的问题,答案是肯定的。 在C#之中,标记一个虚函数为final的关键字是sealed。如第十四行就可以这样写. public sealed override void ShowExampe(string example)
method public hidebysig newslot virtual final instance void ShowExampe(string example) cil managed
.method public hidebysig newslot virtual instance void ShowExampe(string example) cil managed
.method public hidebysig newslot abstract virtual instance void ShowExampe(string example) cil managed