Warum müssen das denn überhaupt verschiedene Klassen sein? Die sehen nämlich eigentlich alle ziemlich gleich aus. Ich würd's so machen
Delphi-Quellcode:
type TRuneTypes = (rtX, rtY, rtZ);
const RuneRarities: array[0..2] of integer = [100, 200, 300];
RuneColors: array[0..2] of TColor = [clGrey, clTeal, clRed]; // Da bin ich mir mit der Syntax nicht ganz sicher
type TRune = class
constructor Create(RuneType: TRuneType);
private
FRuneType: TRuneType;
function GetRarity: integer;
function GetColor: integer;
public
property RuneType: TRuneType read FRuneType write FRuneType;
property Rarity: integer read GetRarity;
property Color: TColor read GetColor;
end;
constructor TRune.Create(RuneType: TRuneType);
begin
inherited Create;
FRuneType := RuneType;
end;
function TRune.GetRarity: integer;
begin
Result := RuneRarities[ord(RuneType)];
end;
function TRune.GetColor: TColor;
begin
Result := RuneColors[ord(RuneType)];
end;
//edit
Ah, seh gerade dass dir die Performance so wichtig ist. Dann könnte man das auch so machen:
Delphi-Quellcode:
const RuneRarities: array[0..2] of integer = [100, 200, 300];
RuneColors: array[0..2] of TColor = [clGrey, clTeal, clRed]; // Da bin ich mir mit der Syntax nicht ganz sicher
type TRune = class
constructor Create(ARuneType: TRuneType);
private
FRuneType: TRuneType;
FRarity: integer;
FColor: TColor;
procedure SetRuneType(Value: TRuneType);
procedure Recalculate;
public
property RuneType: TRuneType read FRuneType write SetRuneType;
property Rarity: integer read FRarity;
property Color: TColor read FColor;
end;
constructor TRune.Create(ARuneType: TRuneType);
begin
inherited Create;
RuneType := ARuneType; // Ruft den Setter auf zum Initialisieren;
end;
procedure TRune.Recalculate;
begin
FRarity := RuneRarities[ord(RuneType)];
FColor := RuneColors[ord(RuneType)];
end;
procedure TRune.SetRuneType(Value: TRuneType);
begin
if Value <> RuneType then begin
FRuneType := Value;
Recalculate; // Alles neu berechnen
end;
end;