【发布时间】:2012-07-03 10:41:34
【问题描述】:
我今天遇到了一个问题,试图覆盖一个没有被声明为虚拟的接口方法的实现。
在这种情况下,我无法更改接口或基本实现,必须尝试其他方法,但我想知道是否有办法强制类使用虚拟方法实现接口。
例子:
interface IBuilder<T>
{
// Already implicitly virtual
/*virtual*/ T Build();
}
// This is a class written by someone else
class SimpleBuilder: IBuilder<SomeObject>
{
// I would like to force this to be virtual
public SomeObject Build() { return new SomeObject(); }
}
// This is the class I am writing.
class CustomBuilder: SimpleBuilder
{
public /*override*/ SomeObject Build()
{
var obj = base.Build();
obj.ModifyInSomeWay();
return obj;
}
}
编辑:CustomBuilder 旨在与 MEF 一起使用,因此我从 SimpleBuilder 派生,以便 MEF 解析正确的类型。我已经尝试显式实现该接口,而不是从 SimpleBuilder 派生,但 MEF 没有选择正确的类型。
有问题的接口和基类位于另一个开发人员创建的共享模块中,因此看来我无论如何都必须让他们更改其基类。
【问题讨论】:
-
您可以在派生类上显式实现接口,但这只会影响通过接口进行的调用,而不影响通过派生类自己的类型(也不通过其基类)进行的调用。
-
您能将
SimpleBuilder和Build()方法声明为抽象方法吗? -
我假设其他人是 SimpleBuilder 的作者,我无法轻易更改它。我希望接口强制将该方法声明为虚拟,以便稍后编写自定义版本时可以覆盖它。
标签: c# inheritance interface