接口中的C#方法在不使用virtual关键字的情况下声明,并在派生类中重写而不使用override关键字.
是否有一个原因?我认为它只是一种语言方便,显然CLR知道如何处理这个问题(默认情况下方法不是虚拟的),但还有其他技术原因吗?
以下是派生类生成的IL:
class Example : IDisposable {
public void Dispose() { }
}
.method public hidebysig newslot virtual final
instance void Dispose() cil managed
{
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Example::Dispose
Run Code Online (Sandbox Code Playgroud)
请注意,该方法virtual final在IL中声明.
我正在做一个小项目,我遇到了这个问题.
项目输出是包含接口的库.我希望实现该接口并尽可能密封其中的函数:
public interface ITest
{
void SomeMethod();
}
class A : ITest
{
public sealed override SomeMethod()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是让每个人都可以使用该界面,并拥有一些实现它的专门类.例外情况是,我想确保如果某人创建了类型A的专用类,他/她将无法更改方法的行为.
问题是您不能在其中放置"override"关键字,因为该方法未在界面中声明为"虚拟".而且你不能在接口中将其声明为"虚拟",因为它是不允许的.并且您无法删除"override"关键字,因为"密封"需要它.
任何变通方法或头脑风暴的想法都会受到欢迎,但如果有人能想出一个包含界面的解决方案,我会非常乐意学习它!
谢谢!
编辑:忘了这个问题!就像Ani说的那样,我忘了默认C#中的方法是密封的.似乎偶尔回到基础知识总是好的...
我是 TDD 新手,我正在使用它Moq作为我的模拟框架。我正在尝试检查我的类中是否已调用某个方法。该类没有实现任何接口。
var mockFooSaverService = new Mock<FooSaverService>();
mockFooSaverService.Verify(service => service.Save(mockNewFoo.Object));
Run Code Online (Sandbox Code Playgroud)
为了使这项工作正常进行,我发现我必须将该Save()方法作为一种Virtual方法。
问题:
Virtual仅仅为了使其可测试而对类中的所有方法使用关键字会产生什么后果?