Zusammensetzung und Vererbung.Gibt es irgendetwas, das die Vererbung nicht erreichen kann?
Ich bin mir bewusst, dass sie beide Tools sind, wenn sie geeignet sind, und Kontext ist sehr wichtig bei der Wahl zwischen Zusammensetzung und Vererbung. Die Diskussion über den entsprechenden Kontext ist jedoch meist etwas unscharf; Das hat mich dazu gebracht, darüber nachzudenken, wie deutlich Vererbung und Polymorphismus getrennte Aspekte traditioneller OOPs sind.
Polymorphismus ermöglicht es, "is-a" Beziehungen gleichermaßen sowie Vererbung anzugeben. Insbesondere erzeugt das Erben von einer Basisklasse implizit eine polymorphe Beziehung zwischen dieser Klasse und ihren Unterklassen. Während Polymorphismus jedoch unter Verwendung reiner Schnittstellen implementiert werden kann, verkompliziert die Vererbung die polymorphe Beziehung durch gleichzeitiges Übertragen von Implementierungsdetails. Auf diese Weise unterscheidet sich die Vererbung deutlich vom reinen Polymorphismus.
Als Werkzeug dient Vererbung anders Programmierer als Polymorphismus (durch reine Schnittstellen) durch Umsetzung wiederverwendet in trivialen Fälle vereinfacht. In den meisten Fällen stehen die Implementierungsdetails einer Oberklasse jedoch in einem subtilen Konflikt mit den Anforderungen einer Unterklasse. Deshalb haben wir "overrides" und "member hiding". In diesen Fällen wird die Wiederverwendung der Implementierung, die durch die Vererbung angeboten wird, mit dem zusätzlichen Aufwand der Überprüfung von Statusänderungen und Ausführungspfaden über kaskadierende Codeebenen hinweg erworben: Die vollständigen "abgeflachten" Implementierungsdetails der Unterklasse sind auf mehrere Klassen verteilt, was normalerweise bedeutet mehrere Dateien, von denen nur Teile für die betreffende Unterklasse gelten. Das Durchsehen dieser Hierarchie ist im Umgang mit der Vererbung absolut notwendig, denn ohne den Code der Oberklasse zu betrachten, gibt es keine Möglichkeit zu wissen, welche unbeherrschten Details mit Ihrem Zustand zusammenhängen oder Ihre Ausführung umleiten.
Im Vergleich, exklusive Verwendung von Komposition garantiert, dass Sie sehen können, welcher Status durch explizit instanziierte Objekte geändert werden kann, deren Methoden nach Ihrem Ermessen aufgerufen werden. Eine wirklich abgeflachte Implementierung wird immer noch nicht erreicht (und ist tatsächlich nicht einmal wünschenswert, da der Nutzen von strukturierter Programmierung die Kapselung und Abstraktion von Implementierungsdetails ist), aber Sie erhalten trotzdem Ihre Code-Wiederverwendung und Sie müssen nur an einer Stelle suchen wenn der Code sich falsch verhält.
Mit dem Ziel, diese Ideen in der Praxis zu testen, traditionelles Erbe für eine Kombination aus reinem Interface-basierten Polymorphismus und Objekt Zusammensetzung meidet, ich frage mich,
Gibt es Objekt Zusammensetzung etwas und Schnittstellen kann das Erbe nicht erreichen können ?
bearbeiten
In den Antworten bisher ewernli glaubt, dass es keine technischen Meisterleistungen für eine Technik verfügbar sind, aber nicht die andere; Er erwähnt später, wie verschiedene Muster und Designansätze für jede Technik inhärent sind. Dies liegt nahe. Der Vorschlag führt mich jedoch dazu, meine Frage zu präzisieren, indem ich frage, ob die ausschließliche Verwendung von Komposition und Schnittstellen anstelle der traditionellen Vererbung die Verwendung von wichtigen Entwurfsmustern verbieten würde. Und wenn ja, gibt es nicht gleichwertige Muster für meine Situation?
Ich persönlich mag Mixins. :) –
Ich habe keine Zeit für eine effektive Duplizierung zu überprüfen, aber diese Vererbung v. Zusammensetzung Thema wird ständig auf SO besucht, für ex. http://stackoverflow.com/questions/216523/object-oriented-best-practices-inheritance-v-composition-v-interfaces oder http://stackoverflow.com/questions/1598722/should-i-use-inheritance -oder-Zusammensetzung. "Man kann diesem Thema immer eine Wendung geben und es als eine neue Sicht auf die Dinge bezeichnen ..." Eine Sache, der wir zustimmen sollten, ist, dass diese Art von Frage nicht zu endgültigen oder sogar autoritativen Antworten führt. Vielleicht ist ein CW-Format besser geeignet ... – mjv
Ich wollte nicht eine müde Debatte wieder aufleben lassen. Zugegebenermaßen war die Art und Weise, wie ich meinen Fall darlegte, eher eine einseitige Probe dieser Debatte, aber mein Hauptinteresse liegt in der Beantwortung der Frage, ob es eine Vererbungsform gibt, die wirklich nicht durch Komposition und Schnittstellen ersetzt werden kann. p.s., was ist ein CW-Format? Vielleicht werde ich das versuchen ... –