![]() |
OOP und ihre Tücken...
Ich arbeite gerade an einem Dateisystem mit funktionen für Zip's etc, und bin darauf auf ein interessantes verhalten gestoßen:
Ich habe mehrere Klassen für eine Datei(noFile, noFile_Permanent, noFile_Memory, noFile_InZip), um eben die verschiedenen Instanzen von Dateien speichern zu können. Die letzten 3 erben nun wiederum von noFile. Hat man nun allerdings eine Prozedur a la:
Delphi-Quellcode:
Landet man, wenn man die Rückgabe dieser Prozedur anspricht, bei den Prozeduren der BasisKlasse noFile (z.B. habe ich eine Methode Length, die bei noFile = 0 zurückgibt, bei Permanet die Länge der Datei), statt bei denen von noFile_Permanent.
function GetOSFile: noFile;
begin Result := noFile_Permanent.Create; end; Nun zur eigentlichen Frage: Warum geht das überschreiben der Prozeduren verloren? Nach meinem Verständnis von OOP sollte man über das Ergebnis doch jetzt die (überschriebenen) Prozeduren von noFile_Permanent ansprechen. Warum ist das nicht so, oder was mache ich falsch? |
AW: OOP und seine tücken...
Ist das eine reguläre Funktion oder eine Methode? Falls Letzteres, wurde sie in der Basisklasse als virtuell deklariert und in der abgeleiteten überschrieben? Im Übrigen bin ich persönlich kein Freund von Funktionen, die eine Objektinstanz zurückgeben, die sie selbst erzeugen.
|
AW: OOP und seine tücken...
In der BasisKlasse ist die Prozedur virtual, und die abgeleiteten Klassen überschreiben die Prozedur dementsprechend...
|
AW: OOP und seine tücken...
Nunja, der Rückgabetyp ist ja nun einmal vom Typ noFile. Du könntest diesen aber nach dem Funktionsaufruf auf den "Untertyp" überprüfen. Oder man macht es ganz anders und übergibt noch einen Klassentypen, in der Art
Delphi-Quellcode:
type
noFileClass = class of noFile; function GetOSFile(aType: noFileClass): noFile; begin Result := aType.Create; end; |
AW: OOP und seine tücken...
Werd mal versuchen einen Klassentypen mit einzubauen...auch wenn das imho nicht nötig sein sollte / nichts ändern dürfte...mal schauen
[Edit] Habs drin gehabt mit klassentyp - keine Veränderung, dann nen Rollback gemacht, und jetzt Läufts...verstehe wer will, ich tus nicht, aber es läuft jetzt. |
AW: OOP und seine tücken...
Moin Detlef,
Zitat:
|
AW: OOP und seine tücken...
Moin Christian,
das ist etwas anderes, aber dann ist der Code auch ausführlicher ;). Als Negativbeispiel sehe ich z.B. GetFormImage an, da man die so ermittelte Instanz selbst freigeben muss, das ist IMO sehr unschön. |
AW: OOP und seine tücken...
Moin Detlef,
Zitat:
|
AW: OOP und seine tücken...
|
AW: OOP und seine tücken...
Zitat:
|
AW: OOP und seine tücken...
Ich verstehe das Problem nicht. Das funktioniert doch alles wie gewünscht:
Delphi-Quellcode:
Type
TA = Class Function WhoAmI : String; Virtual; End; TB = Class(TA) Function WhoAmI : String; override; End; Function TA.WhoAmI : String; begin result := 'A'; end; Function TB.WhoAmI : String; begin result := 'B'; end; Function GetInst : TA; Begin Result := TB.Create; End; Var test : TA; begin test := GetInst; Writeln(test.WhoAmI) // Liefert 'B', was auch sonst test.free; end; |
AW: OOP und seine tücken...
Zitat:
Zitat:
Das Problem ist, dass die Elternklasse keinen primitven Datentypen zurückgibt, sondern eine Objektinstanz. In den abgeleiteten Klassen soll nun auch eine Instanz einer abgeleiteten Klasse zurückgegeben werden, deren Methoden man dann ohne Cast nutzen kann. |
AW: OOP und ihre Tücken...
Hä?
Zitat:
Das widerspricht aber deiner Erklärung. Sein Problem habe ich durch meinen Code wiederlegt. Mir scheint, ihr redet von etwas anderem. Das Wetter ist eh zu schön, um hier vor dem Rechner zu sitzen. Viel Spass noch. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz