Zitat von
BillieJoe90:
Mein Problem ist, dass ich Monopoly programmiere und für jeden Typ von Feld eine eigene Klasse haben möchte, trotzdem die Felder aber per Feld[i] anwählen können möchte.
Wenn mir keiner helfen kann, mache ich es so, dass eine Klasse für alle da ist und je nachdem, was für einen Typ die Instanz hat, reagieren die Methoden... Nicht sonderlich elegant, aber es wird nicht anders gehen...
Na, grundsätzlich kann man das so machen, man muss aber die Arbeit DELEGIEREN! Das heißt:
NICHT je nach Typ dies oder das tun
SONDERN unabhängig vom Typ immer das gleiche tun - das ist aber bei jedem Typ anders deklariert.
Dies machst Du mit virtuellen Methoden:
Delphi-Quellcode:
type
TPerson = class
private
FName: string;
public
property Name: string read FName write FName;
end;
TCommonField = class
private
...
public
procedure Enter(APerson: TPerson); virtual; abstract;
end;
TNorthStation = class(TCommonField)
private
...
public
procedure Enter(APerson: TPerson); override;
end;
TKnast = class(TCommonField)
private
...
public
procedure Enter(APerson: TPerson); override;
end;
...
procedure TNorthStation.Enter(APerson: TPerson);
begin
ShowMessage(APerson.Name + ' auf Nordbahnhof');
end;
procedure TKnast.Enter(APerson: TPerson);
begin
ShowMessage(APerson.Name + ' im Knast');
end;
var
Person1: TPerson;
Knast: TKnast;
Nordbahnhof: TNorthStation;
Feld: TCommonField;
begin
Person1 := TPerson.Create;
Person1.Name := 'Billy Joe';
Knast := TKnast.Create;
Nordbahnhof := TNorthStation.Create;
Feld := Knast;
Feld.Enter(Person1);
Feld := Nordbahnhof;
Feld.Enter(APerson);
end;
Die beiden Enter-Methoden sind jeweils anders implementiert. In deiner Prozedur bekommst Du ein Field: TCommonField und rufst lediglich Field.Enter(APerson) auf. Fertig.