Einzelnen Beitrag anzeigen

samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#9

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 2. Okt 2010, 08:45
Um das Typecasting komplett zu vermeiden, kann man generische Listen verwenden, aber die gibt es bei Delphi 7 nicht.
Ich benutze sowohl Records als auch Klassen. Die Entscheidung welches Konstrukt ich verwende, hängt vom Anwendungsfall ab. Dabei berücksichtige ich die Vorteile die die Strukturen jeweils bieten:
Vorteile Records:
  • 4 Byte weniger Speicherbedarf pro Instanz
  • Einzelne Instanzen können auf dem Stack angelegt werden (schneller)
  • Automatisch angelegte Instanzen werden auch automatisch freigegeben
Vorteile Klassen:
  • Vererbung möglich
  • Typeinformation zur Laufzeit vorhanden
Wenn ich also sehr viele Instanzen anlegen möchte (Hausnummer: mehr als 10000) und keine Vererbung benötige, dann benutze ich gerne auch Records. Um eine Liste von Records zu verwalten, verwende ich meist ein offenes Array, weil ich mich dann nicht um die Freigabe zu kümmern brauche. Dafür habe ich einen höheren Aufwand beim Hinzufügen der Instanzen. Aber man kann natürlich auch TList benutzen.
Zurück zur Ausgangsfrage: Um das Typcasting einzuschränken, würde ich bei TMyFile die Get-Funktion ändern. Etwa so:
Delphi-Quellcode:
   
type TMyFiles = class
  private
    FList: TList;
  public
  property Items[Index: Integer]: pFileRec read Get write Put; default;
end;
Das Typecasting ist dann nur einmal in "Get" bzw. "Put" notwendig. Der Zugriff sieht dann so aus:

Delphi-Quellcode:
var
  allFileList: TMyFiles;
...
if allFileList[i].ext='PASthen
Der Klasse TMyFiles ist es jetzt egal, ob sie "Besitzer" der Records ist, oder ob sie nur Verweise auf die Records verwaltet. Beim Freigeben muss man natürlich unterscheiden, ober man nur die Verweise freigeben will, oder auch die Records. Das kann man dann so machen, wie TObjectlist (ein Boolean zeigt an, was freigeben werden soll) oder man kümmert sich in jedem Einzelfall selbst darum.
N.B. Die Add Funktion muss natürlich auch noch entsprechend geändert werden (statt TFileRec nun pFileRec), oder man erfindet eine neue Funktion AdRef(file: pFileRec) oder wie auch immer...
  Mit Zitat antworten Zitat