![]() |
Delphi-Version: 5
Attribute überschreiben
Ich habe in einem Projekt eine Business-Klasse, die mit Attributen dekoriert ist, um daraus automatisch ein Eingabeformular zu generieren (Beschriftung, PosX, PosY...).
Beispiel:
Code:
Diese Klasse überschreibe ich, um zusätzliche Properties einzufügen.
[Numeric('Bahngeschwindigkeit','',134,59)]
Gibt es eine Möglichkeit, in der abgeleiteten Klasse auch Attribute der Basisklasse zu überschreiben (z.b. eine anderssprachige Beschriftung, andere PosX...) Vielen Dank |
AW: Attribute überschreiben
Hätte man doch einfach mal ausprobieren können, oder?
Delphi-Quellcode:
ergibt bei mir
program Project2;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Rtti; type NumericAttribute = class(System.TCustomAttribute) public var someNumber: Integer; public constructor Create(const someNumber: Integer); end; [Numeric(42)] TBase = class(TObject) // Stub end; [Numeric(99)] TSub = class(TBase) // TStub end; { TNumericAttribute } constructor NumericAttribute.Create(const someNumber: Integer); begin inherited Create(); self.someNumber := someNumber; end; procedure printNumericInfo(const ofType: TRttiType); var attribute: TCustomAttribute; numeric: NumericAttribute; begin for attribute in ofType.GetAttributes() do begin if not (attribute is NumericAttribute) then Continue; numeric := attribute as NumericAttribute; Write( ofType.ToString() ); Write(' has a numeric value of '); WriteLn(numeric.someNumber); end; end; procedure justRttiThings(); var ctx: TRttiContext; base: TBase; sub: TSub; begin ctx := TRttiContext.Create(); base := TBase.Create(); sub := TSub.Create(); printNumericInfo( ctx.GetType(base.ClassType) ); printNumericInfo( ctx.GetType(sub.ClassType) ); end; begin try justRttiThings(); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; readln; end.
Code:
TBase has a numeric value of 42
TSub has a numeric value of 99 Oder habe ich das falsch verstanden? |
AW: Attribute überschreiben
Ausprobiert hab ich das anhand meiner Klassen schon, da kam aber was anderes bei raus, weil die Attribute auch etwas anders sitzen:
Code:
und da taucht halt dann bei Eigenschaft1 das Attribut aus der Basisklasse auf, das ich gerne ersetzt hätte.
TBaseClass = class(TControl)
published [Checkbox('Ich bin die Beschriftung',10,10)] property Eigenschaft1: Boolean read ... write...; end TChildclass = class(TBaseClass) published [Checkbox('Now i am an english caption at different position',20,20)] property Eigenschaft1: Boolean; [Checkbox('I have a second property',30,30] property Eigenschaft2: Boolean read... write...; end; procedure ErstelleTForm(); var Liste: TList<TControl>; element: TControl; begin // so in etwa Liste.Add(TBaseClass.Create); Liste.Add(TChildclass.Create); for element in liste do begin für alle Propertys in Klasse // mit RTTI wenn Attribut(Checkbox) Erstelle TCheckbox in Formular an PosX, PosY mit Caption (und mach gleich ein Databinding zwischen Checkbox und property) end; end |
AW: Attribute überschreiben
Grundsätzlich ist es kein gutes OOP, eine Eigenschaft mit einer konkreten Bedeutung in einer Kindklasse zu überschreiben und ihm dabei eine andere Bedeutung zu geben ('Liskov Prinzip', das 'L' in SOLID).
Vielleicht solltest Du eine Basisklasse ohne Attribute einführen und die Attribute erst in den unterschiedlichen Ableitungen setzen. |
AW: Attribute überschreiben
Grundsätzlich ist es ja auch nicht mein Willen, einer Eigenschaft eine andere Bedeutung zu geben. Es geht ja nur darum, dem Feld eine andere (englische) Beschriftung und eine andere Position zu geben.
Die Basisklasse funktioniert natürlich, da ich die Klasse in verschiedenen Projekten aber leider schon so verbaut habe, wollte ich mir die Änderungen am liebsten sparen. |
AW: Attribute überschreiben
Willst du wirklich für jede Sprache eine eigene Klasse erstellen?
Nimm doch einfach eine Klasse mit den Attributen und beim Auslesen der Attribute holst du dir die Werte, die zu der aktuellen Sprache hinterlegt sind. Findest du keinen Wert, dann wird eben der Wert genommen, der dort hinterlegt ist. |
AW: Attribute überschreiben
Zitat:
![]() Per Hand im Code die Position der GUI-Elemente zu bestimmen finde ich auch etwas gruselig. |
AW: Attribute überschreiben
Hallo,
du möchtest also einen String in dem steht "Ich bin der Martin" und dann überschreibst du diesen String und nun steht da drin "Nee ich heisse doch Detlev". Verstehe ich dass richtig???? Also in C++ kannst du auch Operatoren überladen. mfg frank |
AW: Attribute überschreiben
Zitat:
Ich will nur dieses Eingabeformular etwas individueller gestalten, konkret, weil ich jetzt die Variante englische Sprache brauche. Das Ding muss auch nicht mehrsprachig werden, die verschiedenen Versionen gehen halt an verschiedene Kunden in jeweils einer Landessprache. Ich hatte auch nicht nach Möglichkeiten gesucht, das ganze anders zu programmieren, sondern wollte nur konkret wissen, ob ich diese Attribute variieren kann. Offensichtlich geht das nicht, dann werde ich wohl oder übel zu der Variante Basisklasse ohne Attribute und abgeleitete Klassen mit Attributen wechseln, was halt Änderungen an den bestehenden Projekten mitbringt, was ich eigentlich vermeiden wollte. Danke für die Vorschläge |
AW: Attribute überschreiben
Zitat:
Zitat:
Wenn es überhaupt funktioniert, dann steckt das Problem vermutlich irgendwo in
Delphi-Quellcode:
.
für alle Propertys in Klasse // mit RTTI
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 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 by Thomas Breitkreuz