是否有可能不实现从C#中的接口继承的方法?

时间:2010-08-04 16:30:05

标签: c# interface implementation

查看Project Server 2010 SDK(在.NET Reflector中找到here),我发现了一些令我困惑的有趣内容。

显然,SvcProject.ProjectClient中的ProjectServerServices.dll类继承自System.ServiceModel.ClientBase<Project>,这是一个实现System.IDisposable接口的抽象类。但是,当我检查SvcProject.ProjectClient类(不是抽象的)时,没有Dispose方法。是什么赋予了?我认为从接口继承的每个方法都必须在具体的实现中实现(否则接口的用途是什么)。 .NET Reflector对我说谎吗?微软出于某种原因绕过了这个要求吗?发生了什么事?

2 个答案:

答案 0 :(得分:9)

它可能已经实现显式,如下所示:

void IDisposable.Dispose()
{
    // Code here
}

或者它从基类继承该方法。仅仅因为ClientBase<T>是抽象的并不意味着它本身不能正确实现IDisposable。实际上, 要么实现它,要么将其重新声明为抽象方法,以强制派生类实现它。

无论哪种方式,该方法都会以某种方式存在。

显式接口实现意味着该方法仅在通过接口类型查看实例时可用。例如:

class Foo : IDisposable
{
    void IDisposable.Dispose() {}
}

...

Foo foo = new Foo();
foo.Dispose(); // Invalid: compile time error
IDisposable d = foo;
d.Dispose();   // Valid
((IDisposable)foo).Dispose(); // Valid (no need for temp variable)

答案 1 :(得分:6)

不看,我会说基类提供Dispose方法,具体类根本不会覆盖它。 编辑:并且(在查看之后),它确实提供了一个非抽象的显式实现IDisposable.Dispose