Ich stehe im Interview regelmäßig vor dieser Frage. Aber ich bekomme es nirgends Antwort. Bitte helfen Sie mir.Warum brauchen wir eine Erweiterungsmethode, wenn die Vererbung bereits existiert?
Antwort
Vererbung und Erweiterung Methoden sind völlig orthogonal. Es ist nur eine einfache Möglichkeit, eine Funktion in C# mit der bekannten Syntax .
zu schreiben. Sie sehen nur ähnlich aus, wenn Sie Vererbung für die Wiederverwendung von Code verwenden, was tendenziell verpönt ist (aber stellen Sie sicher, dass Sie verstehen, warum - "beste" Praktiken sind kontextsensitiv :)).
In jedem Fall würde ich erwarten, dass die Frage Sie sprechen. Konzentrieren Sie sich nicht zu sehr darauf, was die "richtige" Antwort ist - beschreiben Sie einfach, welche Vererbung für Sie verwendet wird und welche Erweiterungsmethoden verwendet werden und welche Vor- und Nachteile jede davon hat. Lassen Sie den Dialog laufen.
Für mich zum Beispiel, Erweiterungsmethoden sind alle über gemeinsame Funktionen gegen eine Schnittstelle. Das heißt, die Funktionen fügen Funktionalität über eine Schnittstelle (oder Klasse) hinzu, während sie nur ihre öffentliche Schnittstelle verwenden. Dies macht die "Größe" der Schnittstelle für die Funktion viel kleiner, was es wiederum viel einfacher macht, darüber nachzudenken.
Verschiedene Menschen verwenden die Extension-Methoden anders, genauso wie verschiedene Leute die Vererbung anders benutzen. Ich finde jedoch, dass, wenn Sie von der Vererbung zur Komposition wechseln, Erweiterungsmethoden immer nützlicher werden (und wirklich, natürlich). Vererbung ist eine sehr spezifische Technik, die für fast alles mit wenig Grund verwendet wurde, aber das ist ein großes Thema auf Programmers.SE schon sowieso, genau wie die Komposition vs Vererbungs Debatte :))
- 1. Warum brauchen wir targetNamespace?
- 2. Warum brauchen wir JWT, wenn wir Clientsitzungen haben?
- 3. warum brauchen wir WCF
- 4. Warum brauchen wir np.squeeze()?
- 5. Warum brauchen wir Entwurfsmuster
- 6. Warum wir analyse_export brauchen, wenn wir haben analyse_port
- 7. Warum brauchen wir RD/WR, wenn wir DT/R haben?
- 8. Angular2 warum brauchen wir die es6-Shim
- 9. Warum StringJoiner, wenn wir bereits StringBuilder haben?
- 10. Warum brauchen wir statische Konstruktoren?
- 11. Warum brauchen wir ungültige Funktionen?
- 12. Warum brauchen wir einen Grobquantisierer?
- 13. Warum brauchen wir Web-Sockets?
- 14. Warum brauchen wir virtuellen Speicher?
- 15. Warum brauchen wir ng-click?
- 16. Warum brauchen wir hier typename?
- 17. Warum brauchen wir virtuelle Tabelle?
- 18. Warum brauchen wir "out" -Parameter?
- 19. Warum brauchen wir eine Schnittstelle, wenn wir eine abstrakte Klasse haben?
- 20. Wie man eine Nachricht anzeigt, wenn die Datei bereits existiert
- 21. Warum brauchen wir die GLOB-Klausel in SQLite?
- 22. Warum brauchen wir einen Apache-Server, wenn wir eine Rails-App bereitstellen?
- 23. Warum brauchen wir Standardmethoden in Java?
- 24. Warum brauchen wir den Dekorateur im Dekorationsmuster?
- 25. Warum brauchen wir scalaz.stream über iteratee?
- 26. Warum brauchen wir @Entity Annotation, wenn wir die Klasse in der Konfigurationsdatei definieren
- 27. Warum brauchen wir zone_highmem auf x86?
- 28. ASP.NET_SessionId vs. ASPXAUTH warum brauchen wir beide?
- 29. Warum brauchen wir Schnittstellen in Java?
- 30. Warum brauchen wir force.on ('tick' .. in d3
Was ist mit versiegelten Klassen? –
Erweiterungsmethoden sind syntaktische Zucker, die der Sprache hinzugefügt wurden, damit Linq-Aufrufe so aussehen, als wären sie in alle Klassen eingebaut, die 'IEnumerable <> 'usw. implementieren. Das heißt, Sie können eine Methode" hinzufügen " zu einer Klasse, für die Sie nicht den Quellcode haben oder die versiegelt ist. –