2010-08-04 111 views
0

望着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

回答

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

是的,它是在基類中明確實現的。我錯過了它,因爲它是'IDisposable.Dispose'而不是'Dispose'。 – 2010-08-04 16:43:33

6

沒有看,我會說基類提供了Dispose方法,而具體類根本沒有覆蓋它。 編輯:(看後),它確實提供了一個非抽象的顯式實現,如IDisposable.Dispose

+0

嗯,我沒有在具體類('SvcProject.ProjectClient')中看到實現,但是你提到的實現基礎類是正確的。我對C#很陌生,不習慣爲了讓編譯器認識到一個類實現了一個接口而必須轉換爲接口。 – 2010-08-04 16:41:43