Diskussion:Open-Closed-Prinzip

aus Wikipedia, der freien Enzyklopädie
Letzter Kommentar: vor 13 Jahren von Sebastian.Dietrich in Abschnitt Beispiel Vererbung
Zur Navigation springen Zur Suche springen

Beispiel Vererbung

[Quelltext bearbeiten]

Ich bin fest der Meinung, dass Vererbung nicht a priori das OCP erfüllt. Vielmehr muss eben gerade bei Anwendung von Vererbung darauf geachtet werden, das OCP zu erfüllen.

Beispiel: Wenn eine Methode überschrieben wird, so wird das Verhalten der Klasse verändert. Der Artikel argumentiert, dass das Verhalten der Basisklasse nicht verändert wird. Logisch, die Basisklasse kann man nie verändern, aber wenn ein Clientcode eine Variable hat, die mit dem Typ der Basisklasse deklariert wird, jedoch eine Instanz der Subklasse erhält, verändert sich plötzlich das Verhalten, und das ist genau, was Bertrand Meyer mit "Modification" meint. Der Client müsste schon explizit mit den Werkzeugen des Polymorphismus verlangen, dass der ursprüngliche Code durchgeführt wird. Das OCP-Prinzip ist verletzt.

Teil der Umsetzung des OCP Prinzips ist deshalb z.B., gewisse Methoden als Sealed/Static/Non-Virtual zu markieren und stattdessen Entwurfsmuster wie Strategy, Decorator, Template Method anzuwenden.

Gruss --Chiccodoro 13:32, 8. Okt. 2010 (CEST)Beantworten

Klar erfüllt Vererbung nicht a priori das OCP - es ist nur ein Mittel um (speziell den Open Teil) OCP umzusetzen. So steht es aber auch im Text.
Das Beispiel dass Du bringst ist aber falsch. Das Verhalten einer Klasse darf durch Vererbung nicht verändert werden (d.h. die Subklasse muss sich 100% so wie die Superklasse verhalten). Ansonsten wird (wie im Text steht) das Liskovsche Substitutionsprinzip verletzt.
Eine überschriebene Methode, die das Verhalten ändert ist also nicht objektorientiert programmiert. Das einzige, was die Methode ändern darf ist der Algorithmus, aber nicht das Verhalten (d.h. gemäß design by contract müssen z.B. alle Vorbedingungen, Nachbedingungen und Invarianten gleich bleiben). --Sebastian.Dietrich 00:35, 9. Okt. 2010 (CEST)Beantworten