2009-12-03 16 views

Antwort

8

(persönlich) Ich sehe nur eine Notwendigkeit für explizite Implementierungen, wenn es einen Konflikt zwischen Methoden mit der gleichen Signatur gibt.

Wenn Sie beispielsweise IEnumerable<T> implementieren, sollten Sie 2 Methoden GetEnumerator() implementieren, die die gleiche Signatur haben, mit Ausnahme des Rückgabetyps. So werden Sie IEnumerable.GetEnumerator() explizit implementieren:

public abstract class MyClass<T> : IEnumerable<T> 
{ 
    public IEnumerator<T> GetEnumerator() 
    { 
     return ...; 
    } 

    IEnumerator IEnumerable.GetEnumerator() // explicit implementation required 
    { 
     return GetEnumerator(); 
    } 
} 

Eine weitere Verwendung für eine explizite Implementierung ist, wenn Sie die Methode nicht wollen, durch eine Objektinstanz aufgerufen werden, sondern nur über eine Schnittstelle. Ich persönlich denke, dass dies nicht viel Sinn macht, aber in einigen sehr seltenen Fällen kann es nützlich sein.

3

Philipps Antwort ist eine praktische, aber es gibt auch architektonische Überlegungen.

Schnittstellen werden verwendet, um Klassen kompatibel zu machen, so dass sie von anderen Objekten konsumiert werden können. Wenn nur diese konsumierenden Objekte die Funktionalität der Schnittstelle benötigen, sollte sie - nach dem Prinzip der geringsten Privilegien - eingeschränkt werden. Es wäre unnötig, diese Schnittstellenmethode allen anderen Benutzern der Klasse zugänglich zu machen.

Paul

+0

Können Sie sich ein Beispiel vorstellen, wo dies zutreffen könnte? – jasonh

+0

Web dev. Wenn eine Klasse für die Bereitstellung von Diensten im Internet konzipiert ist, gibt es möglicherweise Methoden für die Identitätsüberprüfung in einer Sicherheitsschnittstelle, die unter keinen Umständen (lokal) verwendet werden dürfen. Dies ist ein wenig bekanntes C# -Feature, das meiner Meinung nach oft ignoriert wird. Andere Beispiele da draußen? – Paul

1

Ein weiterer Fall für die expliziten Schnittstellen ist, wo das Objekt eine Schnittstelle implementieren, muss Anrufe von einem internen Objekt zu akzeptieren, aber Sie wollen nicht diejenigen, die als Teil Ihrer API belichten.

Verwandte Themen