查看Project Server 2010 SDK(在.NET Reflector中找到here),我发现了一些令我困惑的有趣内容。
显然,SvcProject.ProjectClient
中的ProjectServerServices.dll
类继承自System.ServiceModel.ClientBase<Project>
,这是一个实现System.IDisposable
接口的抽象类。但是,当我检查SvcProject.ProjectClient
类(不是抽象的)时,没有Dispose
方法。是什么赋予了?我认为从接口继承的每个方法都必须在具体的实现中实现(否则接口的用途是什么)。 .NET Reflector对我说谎吗?微软出于某种原因绕过了这个要求吗?发生了什么事?
答案 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
。