![]() |
Klasse mit Konstanten ?
Delphi-Quellcode:
Das ist der Versuch eine Klasse zu erstellen die Konstanten hat. Nur funktioniert das nicht -.-
type TRune1 = class
const Rarity = 400; const Color = clgrey; end; Geht das überhaupt ? Wäre praktisch für mich... PS : Welche Unit brauch man damit clgrey usw nicht mehr undefiniert ist ? |
Re: Klasse mit Konstanten ?
|
Re: Klasse mit Konstanten ?
Was ist do5 bitte ? :gruebel:
sry war ma wieder zu faul wegen der Farbe :mrgreen: |
Re: Klasse mit Konstanten ?
Zitat:
mfG mirage228 |
Re: Klasse mit Konstanten ?
Delphi-Quellcode:
-.-
for i:= 1 to 7 do begin
Delphi[i] := Schrott; end; Muss ich das dann alles in dem constructor machen oder was ? -.- :( |
Re: Klasse mit Konstanten ?
Nein, du musst so eine olle globale Konstane nehmen... :?
btw: Schrott würde ich jetzt nicht sagen, D2005 hat auch nur eine handvoll Neuerungen für den Komposter gebracht. ;) |
Re: Klasse mit Konstanten ?
Zitat:
|
Re: Klasse mit Konstanten ?
Mach dir statt der Konstante doch eine Klassenfunktion, die dir den Wert zurückgibt.. Geht auch.
|
Re: Klasse mit Konstanten ?
Musst du sie denn überhaupt außerhalb der Klasse sehen können?
Wenn nicht kannst du sie in die Implementierung der Unit der Klasse packen. Aber bei 100 mal so ein Ding würde ich über die Struktur nachdenken. ;) |
Re: Klasse mit Konstanten ?
Zitat:
Das wäre Flachsinn. |
Re: Klasse mit Konstanten ?
Zitat:
Delphi-Quellcode:
Performance := Goodbye;
|
Re: Klasse mit Konstanten ?
Delphi-Quellcode:
Würde das so etwa gehen ?
type TRune = class
function GetRarity : Integer; end; type TRune1 = class(TRune) end; type TRune2 = class(TRune) end; function TRune.GetRarity : Integer; begin if Classname = 'TRune1' then Rarity := 300; // Ka ob die Eigenschaft jetzt Classname heißt.. if Classname = 'TRune2' then Rarity := 400; ... end; EDIT : Ich glaube das wäre echtes OOP o.O sowas hab ich ja noch nie gemacht :D ;) @Speedmaster : Ist aber zum Glück nur 2D :mrgreen: |
Re: Klasse mit Konstanten ?
Zitat:
Warum lernst du es nicht, einfach mal dein komischen Vorurteile zu überprüfen? (Ist ja nicht das erste Mal ;) ) @NG Autsch.... |
Re: Klasse mit Konstanten ?
:angel2:
Zeigt mir mal nen Beispiel pls :mrgreen: |
Re: Klasse mit Konstanten ?
Zitat:
@Robert_G: Wer sagt den das ich eine Funktion benutzen würde? |
Re: Klasse mit Konstanten ?
Auch ne Idee aber ich hab ehrlichgesagt keine Lust für jede Klasse nen Konstruktor zu basteln :(
|
Re: Klasse mit Konstanten ?
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:
//edit
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; 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; |
Re: Klasse mit Konstanten ?
Zitat:
Delphi-Quellcode:
musst du halt nur für jede klasse machen, ich weiss ja nicht ob es das so bringt.
type TRune = class
function GetRarity : Integer; virtual; abstract; end; type TRune1 = class(TRune) function GetRarity : Integer; override; end; type TRune2 = class(TRune) function GetRarity : Integer; override; end; function TRune1.GetRarity : Integer; begin Result := 300; end; function TRune2.GetRarity : Integer; begin Result := 400; end; p.s.: warum gibt es nicht sowas wie
Delphi-Quellcode:
, das wäre doch mal praktisch :D
property Value: Integer read 1234;
|
Re: Klasse mit Konstanten ?
@N General:
Die ganzen Mutmassungen über Klassen, Vererbung, u.s.w. ist alles Quark. Du musst ganz zurück an den Anfang und erklären was du überhaupt programmieren möchtest. Irgendwie geht es um Runen; das sind wohl irgendwelche Spielsteine. Welche Eigenschaften soll eine Rune haben ? (Farbe, Wert, X/y-Position, ...) Welche Eigenschaften dürfen im Laufe des Spiels ihren Wert ändern ? Wieviele Runen sollen erzeugt werden ? Gibt es Regeln zur Erzeugung der Runen (z.B. 20 rote, 20 grüne & 20 blaue) Was soll mit den Runen passieren ? (laden aus Datei, anzeigen, ...) Du könntest dich ausserdem über Class Factory oder Builder informieren; die wirst du wahrscheinlich gut gebrauchen können. |
Re: Klasse mit Konstanten ?
Also ich mache eine Art Rollenspiel in dem es die Aufgabe ist alle Runen zu finden (Gotta Catch 'em all :mrgreen:) Die Rarity Eigenschaft beschreibt wie selten eine Rune gedroppt wird. Also ne Rune mit Rarity von hätte ne Dropchance von 30%. eine Rune mit Rarity 1 hätte ne Chance von 0,1% usw.
Die Farbe ist halt ein Zeichen für die Seltenheit. Also z.b Häufige = Grün Seltene = Orange Sehr Selten = Rot Außerdem hat jede Rune nachher eine Besondere Eigenschaft. Die Eigenschaft ist wahrscheinlich ne eigene Klasse, z.B TProperty. Es soll etwa min 100 verschiedene Runen geben. So etwa könnte dann die Klassen aussehen von einer Rune.
Delphi-Quellcode:
Alles war jetzt hier nur Beispielhaft dargestellt.
type
Rune = class Color : TColor; Rarity : Integer; Property : TProperty; end; |
Re: Klasse mit Konstanten ?
Moin Neutral General,
warum überhaupt Konstanten? :gruebel: Wenn Du die Daten in einer Konfigurationsdatei ablegst, kannst Du die Einstellungen doch viel besser justieren, falls erforderlich. |
Re: Klasse mit Konstanten ?
Und bei dem von dir beschriebenen Ziel sehe ich auch nicht die Notwendigkeit verschiedener Klassen. Im Gegenteil! Denn deine Runen unterscheiden sich ja nicht in der Struktur, sondern nur in ihren Eigenschaften: Häufigkeit, Farbe etc.
Das verschiedene Verhalten kann man dann auch über Methodeneigenschaften realisieren oder wie du gesagt hast, als eigenen Klassentyp. Aber für die Runen als solche sind verschiedene Klassen meiner Meinung nach kontraproduktiv und damit der falsche Ansatz. |
Re: Klasse mit Konstanten ?
Mein Vorschlag:
Delphi-Quellcode:
und beim Create übergibts Du die Rarity.
type
TRune = class constructor Create (ARarity: Integer); private FRarity: Integer; FColor: TColor; public property Color: TColor read FColor; property Rarity: Integer read FRarity; end; constructor TRune.Create (ARarity: Integer); begin FRarity := ARarity; case FRarity of 0..3: FColor := clGreen; //etc. end; end; |
Re: Klasse mit Konstanten ?
Nur die Rarity zu übergeben reicht ja nicht weil die Runen ja verschiedene Eigenschaften haben sollen.
Ich will halt so wenig wie möglich schreiben müssen um alle Runen mit ner Seltenheit und min 1 Property auszustatten... |
Re: Klasse mit Konstanten ?
:gruebel: Und dafür schreibst du lieber ca. 100 Runenklassen? :shock: Was ist, wenn du beschließt, nochmal 100 weitere einzufügen? Dann nochmal 100 neue Klassen?
|
Re: Klasse mit Konstanten ?
Ja ich bin halt ratlos ^^
Ich hab noch nie was in sonem Umfang gemacht.. EDIT : Ich seh grad meine "Funktion" -.- Ich glaube ich habe in der Eile da was falsch gemacht :mrgreen: -.- |
Re: Klasse mit Konstanten ?
Hört mir eigentlich irgendjemand zu? Wenn nicht, weise ich auf meine beiden letzten Posts hin. Wenn doch, wüsste ich gerne, was es daran auszusetzen gibt. :roll:
|
Re: Klasse mit Konstanten ?
Zitat:
Delphi-Quellcode:
so find ich praktischer...
type
TRune = class public function GetRarity : Integer; end; TRune1 = class(TRune) end; TRune2 = class(TRune) end; function TRune.GetRarity : Integer; begin Result := -1; if Classname = 'TRune1' then Result := 300; if Classname = 'TRune2' then Result := 400; end; @ Tigerman33 : ja stimmt schon... ich glaube ich mache es so wie da oben... |
Re: Klasse mit Konstanten ?
Dann würd ich aber nicht auf Classname zugreifen, sondern eher mit dem is Operator prüfen.
Delphi-Quellcode:
PS: Was ich gepostet hab ist trotzdem schneller :mrgreen:
function TRune.GetRarity : Integer;
begin Result := -1; if self is TRune1 then begin Result := 300; exit; end; if self is TRune2 then begin Result := 400; exit; end; end; |
Re: Klasse mit Konstanten ?
Stringvergleiche bei Klassennamen? :shock: Seid ihr von allen guten Geistern verlassen? Das macht man mit einen is-Verglich auf Self und dem Typ, von dem man wissen will, ob die Klasse von dem Typ ist..
|
Re: Klasse mit Konstanten ?
Du kannst doch auch einer Variable bei der Definition einen Wert zuweisen:
Delphi-Quellcode:
oder doch nicht... :pale: Jetzt hab ich es gerade getestet...
tclass=class
var rarity:integer=400; color:tcolor=clgray; end; aber ein Konstanten-Array ginge:
Delphi-Quellcode:
type
trune=class rarity:integer; color:tcolor; end; const runen=array[1..300] of trune = (rarity=1;color=clblack, rarity=2;color=clred, rarity=1390;color=$ABCDEF, ... ); |
Re: Klasse mit Konstanten ?
Delphi-Quellcode:
Dann entweder eine Datei (gut zum Anpassen, aber auch gut zum cheaten) oder eine ziemlich grosse Const-Deklaration. Ich schreibe mir dafür immer ein kleines Tool, das die Deklaration z.B. aus einer kleinen DB oder EXCEL -Datei oder so rausliest und die Const-Deklaration bastelt. Der Zugriff auf die Eigenschaften einer Rune erfolgt einfach über das Konstante Array. Was hier über Klassen steht ist imho absoluter Quark. Man kanns mit OOP auch zu weit treiben, finde ich.
Type
TRune = Record ruRareness : Integer; // Nicht Rarity... Das ist die 'Rarität', also ein Ding, keine Eigenschaft ruColor : TColor; ruNochwass : TEgal; End; |
Re: Klasse mit Konstanten ?
Zitat:
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* :mrgreen: 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:
Hier eine Beispiel rune:
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.
Delphi-Quellcode:
Frequency muss kein statischer Wert sein. Bei bestimmten/allen Runen typen, kannst du es ja vom Spielgeschehen abhängig machen.
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. 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... |
Re: Klasse mit Konstanten ?
Zitat:
Zitat:
Schau und lerne:
Delphi-Quellcode:
So, nun rate mal, wie GetRareness und SetRareness implementiert sind? Kommste nicht drauf? Macht nix:
Type
TRune = Class (...) Public Property RuneType : Integer Read.... Property Rareness : Integer Read GetRareness Write SetRareness; ... End;
Delphi-Quellcode:
Wenn ich mir das hier anschaue, komm ich zu dem Schluss, das das kurz, knapp und effektiv ist. Also *kein* Quark.
Function TRune.GetRareness : Integer;
Begin Result := rcMyRuneData[RuneType].ruRareness; End; Tipp: Erst denken, dann meckern. Danke. |
Re: Klasse mit Konstanten ?
Zitat:
Das gilt für Präfixe, genauso wie dafür, was Mr "100 Klassen whatsoever" mit dem Record gemacht hätte, den du vorgeschlagen hast. ;) Wie ich schrieb, wollte ich auch nur eine weitere Möglichkeit zeigen. Meine Lösung hätte den Vorteil, dass immer weitere Ableitungen "reinklinken" könnte. Im Spiel ruft er nur CreateInstance auf, wenn er eine Rune haben will, was für eine es ist sollte dann zufällig anhand der Häufigkeit gewählt werden. |
Re: Klasse mit Konstanten ?
Zitat:
Man kann das denke ich ganz gut mit der TShape-Komponente vergleichen. Es gibt schließlich auch keine Komponenten namens TCircle, TBox, TRoundRect etc. Warum? Weil sie alle--mehr oder weniger--das gleiche machen. Genau wie hier die Runen. Und deshalb wird es über eine Property gesetzt. Alles andere ist hier schlicht overkill, OOP um seiner selbst willen. Das macht den Code groß, unübersichtlich und vermutlich auch noch langsamer. |
Re: Klasse mit Konstanten ?
Zitat:
Ich glaube, das war für beide ein Schnellschuss: Ich habe nicht erwähnt, das es mir nur um die Deklaration der Klassen ging. Egal. Letztendlich sind wir uns ja einig. Und was der tigerman33 sagt, ist eben so einleuchtend wie simpel: Immer locker und "keep it simple". |
Re: Klasse mit Konstanten ?
Zitat:
|
Re: Klasse mit Konstanten ?
Zitat:
|
Re: Klasse mit Konstanten ?
Zitat:
Es gibt noch keine DRM Sytseme für VQKMS (virtual Quarkkuchen mampf streaming). Deshalb könnte ich dir dafür nicht deine "2 Cents" abknöpfen. Also werde ich mich voll und ganz meiner egoistischen VQKMS session widmen. *g* |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz