Hallo Community...
Vor einiger Zeit habe ich die S.O.L.I.D Prinzipien kennengelernt zu denen auch das Liskovsches Substitutionsprinzip zählt.
So wie Wikipedia es zusammenfast:
Zitat:
Das Liskovsche Substitutionsprinzip (LSP) oder Ersetzbarkeitsprinzip fordert, dass eine Instanz einer abgeleiteten Klasse sich so verhalten muss, dass jemand, der meint, ein Objekt der Basisklasse vor sich zu haben, nicht durch unerwartetes Verhalten überrascht wird, wenn es sich dabei tatsächlich um ein Objekt eines Subtyps handelt. Es wurde 1993 von Barbara Liskov und Jeannette Wing formuliert.[3] In einem nachfolgenden Artikel wurde es folgendermaßen formuliert:
Wenn man eine Methode in einer vererbten Klasse deklariert, welche den gleichen Namen hat, wie eine Methode in Ihrer Eltern-Klasse, dann versteckt man die Methode der Elternklasse.
Dann kann man zwischen "reintroduce" und "override" wählen um die Methode zu überschreiben. "override" nur wenn die Elternmethode "virtual" oder "dynamic" war. Ohne Schlüsselwort gibt der Compiler eine Warnung, welche man selbstverständlich nicht möchte.
Der traditionelle Weg eine Methode einer Elternklasse zu überschreiben ist "override". Hierbei wird die Methode der vererbten Klasse aufgerufen und nicht die der Elternklasse, wenn man eine Instanz der Kindklasse als Basisklasse 'casted' oder meint ein Element der Elternklasse vor sich zu haben.
Delphi-Quellcode:
// type
Tpapa = class
public
{ public declarations }
procedure say; dynamic;
end;
Tsohn = class(Tpapa)
public
{ public declarations }
procedure say; override;
end;
// Implementation
var
Sohn : Tsohn;
begin
Sohn := Tsohn.Create;
Tpapa(Sohn).say;
Meine Frage: Wird hier gegen das Liskovsche - Prinzip verstoßen? Normalerweise müsste doch die say-Methode des Tpapa aufgerufen werden wenn dem Prinzip, dass
Zitat:
...eine Instanz einer abgeleiteten Klasse sich so verhalten muss, dass jemand, der meint, ein Objekt der Basisklasse vor sich zu haben, nicht durch unerwartetes Verhalten überrascht wird,...
So würde ja immer das 'unerwartete' say von TSohn aufgerufen werden.
Mit reintroduce anstelle von override bekommt man das erwartete Ergebnis...
Wieso verstoßen wir (oder bin Ich damit alleine) dann gegen das Prinzip? Oder ist das Prinzip veraltet / nur ein Ideal?