Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#14

Re: Mal wieder Klassenvererbung

  Alt 25. Jun 2004, 01:21
Moin!

Delphi-Quellcode:
Unit Geometrie;

Interface

Type
  TGeometrieMetaClass = Class Of TGeometrie; // das ist die Metaklasse

  TGeometrie = Class
  Public
    Constructor Create; Virtual;
    Destructor Destroy; Override;

    Class Function ObjektID: String; Virtual; Abstract;
  End;
So, da hast du dann deine Basisklasse mit dem Constructor und einer Funktion die dir die ID für das Objekt gibt als String. Dies kann dann z.B. "Kreis" oder "Quadrat" sein. Diese Funktion kann als Class Funktion auch ohne eine Instanz aufgerufen werden. Darüber können wir dann später die richtige Klasse finden - wenn in deiner Textdatei denn drinne steht "Kreis" (z.B.).

Ok, nun brauchen wir nur noch eine Funktionalität, die die ganzen Typen annimmt und sie alle kennt:

Delphi-Quellcode:
Unit GeometrieRegSvr;

Interface

Uses
  Geometrie;

Function GetMetaClassForID(Const AID: String): TGeometrie;
Procedure RegisterGeometrieClass(AClass : TGeometrieMetaClass);

Implementation

Var
  GeometrieClasses : Array Of TGeometrieMetaClass;

Procedure RegisterGeometrieClass(AClass : TGeometrieMetaClass);
Var
  i : Integer;
Begin
    // already registered?
  For i := Low(GeometrieClasses ) To High(GeometrieClasses ) Do
    If ( GeometrieClasses [i] = AClass ) Then
      Exit;

  SetLength(GeometrieClasses , Length(GeometrieClasses )+1);
  GeometrieClasses [Length(GeometrieClasses )-1] := AClass ;
End;

Function GetMetaClassForID(Const AID: String): TGeometrie;
Var
  i : Integer;
Begin
  For i := Low(GeometrieClasses) To High(GeometrieClasses) Do
    If ( UpperCase(GeometrieClasses[i].ObjektID) = AID) Then
    Begin
      Result := GeometrieClasses[i].Create;
      Exit;
    End;

  Raise Exception.Create('unbekannter Geometrietyp ' + AID + '!');
End;
So, dann bekommst du mit GetMetaClassForID() schon die fertig angelegte Instanz der Klasse zurück die du suchst. Du musst nun nur noch 2 Dinge machen:

1. Alle deine TKreis, TQuadrat oder sonstige von TGeometrie ableiten und die ObjektID Procedure überschreiben und diese Kennung jeweils zurück geben. Diese Kennung ist gleich der die in die Datei geschrieben wird und gleich der die aus der Datei gelesen wird und die Klasse identifiziert.
2. In diesen Units die dann jeweils ein Objekt enthalten (also z.B: TKreis) musst du einmal diese Klasse hier registrieren. Dies machst du am besten im Initialize der Unit:

Delphi-Quellcode:
Initialization
    // registering the string adapter to the converter
  RegisterGeometrieClass(TKreis);

end.
Und dann klappt das auch schon.

MfG
Muetze1
  Mit Zitat antworten Zitat