Ich glaube nicht, dass das Open/Closed-Prinzip, wie es ursprünglich vorgestellt wurde, die Interpretation ermöglicht, dass finale Klassen durch Injektion von Abhängigkeiten erweitert werden können.
In meinem Verständnis geht es beim Prinzip darum, keine direkten Änderungen an Code zuzulassen, der in Produktion gebracht wurde, und die Möglichkeit, Implementierungsvererbung zu verwenden, während man noch Funktionsmodifikationen zulässt.
Wie in der ersten Antwort darauf hingewiesen, hat dies historische Wurzeln. Vor Jahrzehnten gab es eine Vererbung, Entwickler-Tests gab es nicht, und die Neukompilierung der Codebasis dauerte oft zu lange. Beachten Sie auch, dass in C++ die Implementierungsdetails einer Klasse (insbesondere private Felder) häufig in der Header-Datei ".h" offen gelegt wurden. Wenn ein Programmierer dies ändern müsste, müssten alle Clients neu kompiliert werden. Beachten Sie, dass dies bei modernen Sprachen wie Java oder C# nicht der Fall ist. Außerdem glaube ich nicht, dass Entwickler damals auf ausgefeilte IDEs zurückgreifen konnten, die in der Lage waren, eine Abhängigkeitsanalyse direkt durchzuführen, wodurch die Notwendigkeit häufiger vollständiger Neuerstellungen vermieden wurde.
In meiner eigenen Erfahrung, bevorzuge ich das genaue Gegenteil: "Klassen sollten für Erweiterung (final
) standardmäßig geschlossen werden, aber offen für die Änderung". Denken Sie darüber nach: Heute bevorzugen wir Praktiken wie Versionskontrolle (macht es einfach, frühere Versionen einer Klasse wiederherzustellen/zu vergleichen), refactoring (was uns ermutigt, Code zu ändern, um Design zu verbessern, oder als Auftakt zur Einführung neuer Funktionen) und Entwicklertest, der ein Sicherheitsnetz bietet, wenn der vorhandene Code geändert wird.
Kannst du erklären, was du meinst, indem du standardmäßig "Vererbung" annimmst? –
C# -Methoden sind standardmäßig versiegelt (nicht virtuell). Sie müssen sie explizit als virtuell kennzeichnen. Schade, das gleiche gilt nicht für Klassen. –
http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java Methoden in C# sind standardmäßig nicht virtuell. In Java sind sie standardmäßig virtuell. – cletus