Zitat von
alzaimar:
Was hier über Klassen steht ist
imho absoluter Quark. Man kanns mit
OOP auch zu weit treiben, finde ich.
Quark war, dass class methods vergessen wurden. Quark war, das MetaClasses vergessen wurden...
Quark sind Präfixe wie ru... *ulf*
Bei deinem Record müsste man ja ständig das Ding hin und herschaufeln und es allen Funktionen als Parameter übergeben... *bäh*
Wieviel Sinn es im Endeffekt hat kann ich nicht sagen. Ich wollte nur eine weitere Möglichkeit zeigen.
Mit den Schnipsel unten kannst du TRune.CreateInstance aufrufen und du bekommst zufällig eine Rune einer der registrierten Klassen.
Delphi-Quellcode:
uses
Graphics;
type
TFrequency = 1..100;
TRune = class
published
protected
class procedure Register;
class procedure Unregister;
class function getColor : TColor; virtual;
public
property Color : TColor read getColor;
class function Frequency : TFrequency; virtual; abstract;
constructor Create; virtual;
class function CreateInstance : TRune;
end;
TRuneClass = class of TRune;
implementation
uses
Contnrs;
var
ClassList : TClassList;
constructor TRune.Create;
begin
end;
class function TRune.CreateInstance: TRune;
var
RuneClass : TRuneClass;
begin
// Finde eine Runenklasse, zufällig und anhand ihrer Häufigkeit....
RuneClass := TRuneClass(ClassList[XXX]);
Result := RuneClass.Create();
end;
class function TRune.getColor: TColor;
var
Red, Green, Blue : Byte;
Frequency : TFrequency;
begin
Frequency := self.Frequency();
if Frequency < 51 then
begin
Blue := 0;
Green := 5 * Frequency;
Red := 255 - Green;
end
else
begin
Red := 0;
Blue := 5 * (Frequency - 50);
Green := 255 - Blue;
end;
result := Red + Green shl 8 + Blue shl 16;
end;
class procedure TRune.Register;
begin
if ClassList.IndexOf(Self) = -1 then
ClassList.Add(Self)
else
raise TRuneClassAlreadyRegisteredException(self);
end;
class procedure TRune.Unregister;
begin
ClassList.Remove(Self)
end;
initialization
ClassList := TClassList.Create();
finalization
ClassList.Free();
end.
Hier eine Beispiel rune:
Delphi-Quellcode:
uses
uRune;
type
TSampleRune = class(TRune)
public
class function Frequency: TFrequency; override;
end;
implementation
{ TSampleRune }
class function TSampleRune.Frequency: TFrequency;
begin
Result := 15;
end;
initialization
TSampleRune.Register();
finalization
TSampleRune.Unregister();
end.
Frequency muss kein statischer Wert sein. Bei bestimmten/allen Runen typen, kannst du es ja vom Spielgeschehen abhängig machen.
Aber in einer Instance method hat das ganz sicher _nix_ zu suchen,
IMHO.
Verpasse der TRune noch Eigenschaften so dass du damit auch etwas anfangen kannst und gut ist...