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

问题描述:

望着Project Server 2010的SDK(发现here在.net反射,我发现一些有趣的事情是让我困惑。是否有可能不实现从C#中的接口继承的方法?

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

+0

抽象类可以有实现,所以它很可能在ClientBase 中实现。否则,抽象类与接口有什么不同?除了防止多重继承。 – 2010-08-04 16:39:59

+0

@Brian Rudolph是的,我确实检查了基类,但是我错过了它,因为它是'IDisposable.Dispose'而不是'Dispose'。 – 2010-08-04 16:45:13

它可能已经实现明确,像这样:

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) 
+0

是的,它是在基类中明确实现的。我错过了它,因为它是'IDisposable.Dispose'而不是'Dispose'。 – 2010-08-04 16:43:33

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

+0

嗯,我没有在具体类('SvcProject.ProjectClient')中看到实现,但是你提到的实现基础类是正确的。我对C#很陌生,不习惯为了让编译器认识到一个类实现了一个接口而必须转换为接口。 – 2010-08-04 16:41:43