Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Klasse/Typ als Variable und Parameter verwenden


Ares - Do 04.02.10 16:14
Titel: Klasse/Typ als Variable und Parameter verwenden
Hallo!

Kann man eine Klasse (kein Objekt!) als Parameterverwenden um dann Objekte dieser Klasse zu erzeugen?

Ein Beispiel:

Die Klasse TFahrzeug beinhaltet ein Feld FReifen: TReifen. Je nach konkreter Unterklasse von TFahrzeug, z.B. TAuto oder TMofa, soll FReifen mit einer entsprechenden Unterklasse von TReifen erstellt werden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
type
  // Reifen
  TReifen = class(TObject)
    ...
  end;

  TAutoReifen = class(TReifen)
    ...
  end;

  TMofaReifen = class(TReifen)
    ...
  end;

  // Fahrzeuge
  TFahrzeug = class(TObjec)
  protected
    FReifen: TReifen;
    FReifenKlasse: TKlass;

    procedure SetReifenKlasse; virtual;
  public
    constructor Create;
  end;

  TAuto = class(TFahrzeug)
  protected
    procedure SetReifenKlasse;
  end;

  TMofa = class(TFahrzeug)
  protected
    procedure SetReifenKlasse;
  end;

implementation

// Klassen für Auto und Mofa setzten
procedure TAuto.SetReifenKlasse;
begin
  FReifenKlasse := TAutoReifen;
end;

procedure TMofa.SetReifenKlasse;
begin
  FReifenKlasse := TMofaReifen;
end;

// Fahrzeug Konstruktor
constructor Create;
begin
  SetReifenKlasse;

  // Verwendung von FReifenKlasse für Create <-- Geht das?
  FReifen := FReifenKlasse.Create(...);
end;



Die Unterklassen TAuto und TMofa legen also jeweils in SetReifenKlasse fest, von welchem Typ die Reifen sein sollen. Der allgemeine Konstruktor von TFahrzeug kann dann mit FReifenKlasse arbeiten...

So wie dort steht geht es nicht. Aber gibt es einen Weg wie es dennoch funktioniert?


Mir ist klar, dass man das Ganze auch so lösen kann, dass man statt SetReifenKlasse eine Methode CreateReifen einführt die dann in TAuto und TMofa überschrieben wird damit dort die Reifen vom richtigen Typ erzeugt werden. Aber das ist ja nur ein Beispiel und nicht die Frage. Die Frage, ob es ganz allgemein möglich ist eine Klasse als Variable zu nutzen..

Besten Dank
Ares


guinnes - Do 04.02.10 16:23

Sollte gehen mit

Delphi-Quelltext
1:
2:
3:
4:
5:
Type
  TReifenClass = Class of TReifen;
....

  FReifenklasse : TReifenClass;


Ares - Do 04.02.10 17:10

Danke, das funktioniert prima!


guinnes - Do 04.02.10 17:41

Nennt sich Klassenreferenztyp und wird auch von der VCL häufig benutzt, z.B. bei Collectionen