Thema: Delphi Klasse mit Konstanten ?

Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#33

Re: Klasse mit Konstanten ?

  Alt 9. Sep 2005, 02:52
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...
  Mit Zitat antworten Zitat