Klasse auf Variable zuweisen

marko

Grünschnabel
Hiho!!

Ich habe folgendes Problem:

Um meinen Code ein wenig schlanker zu halten möchte ich nicht die Komplette Funktion 3 mal schreiben sondern auf eine Variable je nach bedarf verschiedene Klassenreferenzen zuweisen und dann mit dieser einen Variable weiter arbeiten.

Zur Veranschaulichung:

type
a = class(TObject);
b = class(TObject);
c = class(TObject);

var
Klassenvariable : (was auch immer hier stehen muss)

begin
case x of
1: Klassenvariable := a;
2: Klassenvariable := b;
3: Klassenvariable := c;
end;

Klassenvariable.Create(Self);
Klassenvariable.doSomething;
Klassenvariable.Free;
end;

Ich hoffe jemand von euch kann mir da kurz auf die Sprünge helfen.

Mfg
Marko
 
Hört sich so an, als ob sich hierfür eine Basisklasse eignet, in der die in allen drei Klassen vorhandene Methode implementiert ist. Also in etwa so:

Code:
type
  TBasisklasse = class(TObject)
    ...
    procedure doSomething; virtual;
  end;
  a = class(TBasisklasse)
    ...
  end;
  b = class(TBasisklasse)
    ...
  end;
  c = class(TBasisklasse)
    ...
  end;

var
  Objektreferenz: TBasisklasse;

begin
  Objektrefernz := TBasisklasse.Create;
  Objektrefernz.doSomething;
  Objektrefernz.Free;
end;

Ansonsten gibt es noch die Möglichkeit einer echten Klassenreferenz, aber auch hier benötigst Du eine Basisklasse, die die Methode einführt. Die Methode muss dann in den anderen Klassen überschrieben werden, um die eigentliche Funktionalität zu implementieren. Beim Ausführen wird dann die zur zugewiesenen Klasse gehörende Methode ausgeführt:

Code:
type
  basis = class(TObject)
    ...
    procedure doSomething; virtual;
  end;
  a = class(basis)
    ...
    procedure doSomething; override;
  end;
  b = class(basis)
    ..
    procedure doSomething; override;
  end;
  c = class(basis)
    ...
    procedure doSomething; override;
  end;
  TKlasse = class of basis;

var
  Klassenreferenz: TKlasse;
  Objektreferenz: basis;

begin
  case x of
    0: Klassenreferenz := a;
    1: Klassenreferenz := b;
    2: Klassenreferenz := c;
  end;

  Objektreferenz := Klassenreferenz.Create;
  Objektreferenz.doSomething;
  Objektreferenz.Free;
end;
 
Vielen Dank für deine Antwort.

Letztere Möglichkeit mit dem "virtual; abstract;" habe ich in der zwischenzeit schon umgesetzt.

Was mir nicht wieder eingefallen war ist die Typendefinition:
cMyClass = Class of TObject;

Gruß
Marko
 

Neue Beiträge

Zurück