This question und Eric Lippert's answer habe mich gefragt: Wie do Sie entscheiden, ob eine explizite oder implizite Implementierung beim Implementieren von Methoden einer Schnittstelle verwenden?Soll ich Interface-Member explizit oder implizit implementieren?
Antwort
(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.
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
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.
- 1. C++ 11: Standardkonstruktor: Implizit oder Explizit?
- 2. Soll ich IDisposable hier implementieren?
- 3. Wird TransactionScope implizit angewendet, bis explizit Completed?
- 4. Explizit und implizit für operator (int)
- 5. Um was soll ich diesen Typ explizit konvertieren?
- 6. Wie soll ich dieses SMS-Benachrichtigungssystem implementieren?
- 7. Qt implizit freigegebener Container von explizit freigegebenen Artikel
- 8. Wo soll ich meine Klassenmethode implementieren?
- 9. Welchen soll ich Handler oder Thread verwenden?
- 10. Was soll ich schlafen oder Timer
- 11. C# - Was ist der Grund für "Explizit implementierte Schnittstellenmitglieder sind immer implizit privat?"
- 12. Wie soll ich User Stories in Bugzilla implementieren?
- 13. Warum explizit "privat" schreiben?
- 14. Soll ich FileUpload.PostedFile.InputStream absetzen?
- 15. wie soll ich sage 200 in php implementieren
- 16. Soll ich System.out.println() oder etwas anderes verwenden?
- 17. Soll ich Vererbung oder Zusammensetzung verwenden?
- 18. Soll ich zuerst übersetzen oder zuerst drehen?
- 19. Soll ich JSON oder XML verwenden?
- 20. Was soll ich lernen? Python oder Rubin?
- 21. Soll ich Intents oder Listeners verwenden?
- 22. Soll ich Dockerfiles oder Image-Commits verwenden?
- 23. Soll ich "Makefile" oder "Makefile" nennen?
- 24. Was soll ich wählen: GTK + oder Qt?
- 25. Java: Soll ich Float oder Float verwenden?
- 26. Soll ich scipy.pi, numpy.pi oder math.pi verwenden?
- 27. Welchen soll ich verwenden? decimal.Add() oder "+"
- 28. Soll ich CouchDB oder SimpleDB verwenden?
- 29. enum oder definieren, welchen soll ich verwenden?
- 30. Soll ich pygame.event.get() oder pygame.event.poll() verwenden?
Können Sie sich ein Beispiel vorstellen, wo dies zutreffen könnte? – jasonh
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