代码之家  ›  专栏  ›  技术社区  ›  Steven Oxley

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

  •  0
  • Steven Oxley  · 技术社区  · 14 年前

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

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

    2 回复  |  直到 14 年前
        1
  •  9
  •   Jon Skeet    14 年前

    可能已经实施了 明确地 ,像这样:

    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)
    
        2
  •  6
  •   tvanfosson    14 年前

    不看,我会说基类提供了Dispose方法,而具体的类只是不重写它。 编辑 :和(在查找之后),它确实提供了一个非抽象、显式的实现 IDisposable.Dispose .