Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi OOP und ihre Tücken... (https://www.delphipraxis.net/170274-oop-und-ihre-tuecken.html)

DelphiCreak 8. Sep 2012 17:53


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:
function GetOSFile: noFile;
begin
   Result := noFile_Permanent.Create;
end;
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.

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?

DeddyH 8. Sep 2012 17:58

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.

DelphiCreak 8. Sep 2012 18:00

AW: OOP und seine tücken...
 
In der BasisKlasse ist die Prozedur virtual, und die abgeleiteten Klassen überschreiben die Prozedur dementsprechend...

DeddyH 8. Sep 2012 18:05

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;

DelphiCreak 8. Sep 2012 18:13

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.

Christian Seehase 8. Sep 2012 19:50

AW: OOP und seine tücken...
 
Moin Detlef,

Zitat:

Zitat von DeddyH (Beitrag 1182122)
Im Übrigen bin ich persönlich kein Freund von Funktionen, die eine Objektinstanz zurückgeben, die sie selbst erzeugen.

Und wenn sie diese Objekte selber verwalten, wie z.B. TListView das TListItem?

DeddyH 8. Sep 2012 21:26

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.

Christian Seehase 8. Sep 2012 21:53

AW: OOP und seine tücken...
 
Moin Detlef,

Zitat:

Zitat von DeddyH (Beitrag 1182139)
das ist IMO sehr unschön.

dann sind wir uns ja einig :cheers:

DeddyH 8. Sep 2012 23:31

AW: OOP und seine tücken...
 
Sieht so aus :mrgreen:

P.S.: http://www.detlef-heibing.de/program...rueckgabe.html

Sir Rufo 8. Sep 2012 23:39

AW: OOP und seine tücken...
 
Zitat:

Zitat von DeddyH (Beitrag 1182122)
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.

hmmm, FactoryPattern ... ist eigentlich nicht ungewöhnlich, allerdings so wie es umgesetzt ist ist es keine Factory und da gebe ich dir Recht :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz