2010-08-04 5 views
0

regardant le SDK Project Server 2010 (trouvé here dans le réflecteur .NET, j'ai trouvé quelque chose d'intéressant qui me confond.Est-il possible de ne pas implémenter une méthode héritée d'une interface en C#?

Apparemment, la classe SvcProject.ProjectClient en ProjectServerServices.dll hérite de System.ServiceModel.ClientBase<Project>, qui est une classe abstraite qui implémente l'System.IDisposable Cependant, quand j'inspecte la classe SvcProject.ProjectClient (ce qui n'est pas abstrait), il n'y a pas de méthode Dispose. Ce qui donne? Je pensais que chaque méthode héritée des interfaces devait être implémentée dans une implémentation concrète (sinon quelle est l'utilisation des interfaces) Est-ce que .NET Reflector me ment? Microsoft a-t-il, pour une raison quelconque, contourner cette exigence? Que se passe-t-il?

+0

Les classes abstraites peuvent avoir des implémentations, donc elles sont probablement implémentées dans ClientBase <>. Sinon, comment une classe abstraite pourrait-elle différer d'une interface? Autre que d'empêcher l'héritage multiple c'est. –

+0

@Brian Rudolph Oui, j'ai effectivement vérifié la classe de base, mais je l'ai manquée parce que c'était 'IDisposable.Dispose' au lieu de simplement' Dispose'. –

Répondre

9

Il a probablement été mis en œuvre explicitement, comme ceci:

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

Ou bien il hérite de la méthode de la classe de base. Tout simplement parce que ClientBase<T> est abstrait ne signifie pas qu'il ne peut pas avoir implémenté correctement IDisposable lui-même. En effet, aura soit pour l'implémenter soit pour le redéclarer comme une méthode abstraite pour forcer la classe dérivée à l'implémenter.

De toute façon, la méthode sera là d'une manière ou d'une autre.

La mise en œuvre d'une interface explicite signifie que la méthode n'est disponible que lorsque l'instance est visualisée via le type d'interface. Par exemple:

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

Ouais, il a été implémenté explicitement dans la classe de base. Je l'ai manqué parce que c'est 'IDisposable.Dispose' au lieu de simplement' Dispose'. –

6

Sans regarder, je dirais que la classe de base fournit la méthode Dispose et que la classe concrète ne l'ignore pas. EDIT: Et (après avoir regardé), il fournit une implémentation explicite non-abstraite comme IDisposable.Dispose.

+0

Hmm, je ne vois pas une implémentation dans la classe concrète ('SvcProject.ProjectClient'), mais vous aviez raison sur la classe de base fournissant une implémentation. Je suis un peu nouveau sur C# et je ne suis pas habitué à avoir une distribution vers une interface pour que le compilateur reconnaisse qu'une classe implémente une interface. –

Questions connexes