Autor Beitrag
deepgreen
Hält's aus hier
Beiträge: 12


D7
BeitragVerfasst: Sa 01.01.05 18:27 
Ich möchte eine Klasse schreiben die ich dann halt nur vererbe, um im Grunde genommen eine einheitliche Form zu haben.

bisher hab ich mir das so gedacht

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
TExpressionNode = class
private
  function GetData; virtualabstract;
  procedure SetData(data); virtualabstract;
public
  property Data read GetData write SetData;
end;

TInteger = class(TExpressionNode)
private
  function GetData:Integer; override;
  procedure SetData(data: Integer); virtualabstract;
public
  property Data:integer read GetData write SetData
end;

TExtended = class(TExpressionNode)
private
  function GetData:Extended; override;
  procedure SetData(data: Extended); virtualabstract;
public
  property Data:Extended read GetData write SetData
end;

TBoolean = class(TExpressionNode)
private
  function GetData:Boolean; override;
  procedure SetData(data: Boolean); virtualabstract;
public
  property Data:Booleanread GetData write SetData
end;


So dass ich dann theoretisch aufrufen kann temp1.data + temp2.data (temp1 sei vom typ TInteger und temp2 vom Typ TExtended)
Ist es möglich etwas in der Art zu erreichen ?
Zurzeit behandel ich das noch so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  TExpressionNode = class
  private
    fContent: EType;
  public
    property Content: EType read fContent;
    destructor Destroy; virtualabstract;
    function ResultInt: Integer; virtualabstract;
    function ResultExt: Extended; virtualabstract;
    function ResultBool: Boolean; virtualabstract;
  end;

Und kontrolliere über fContent welche Funktion ich aufrufen muss
Naja, sieht nicht sehr elegant aus, deswegen dacht ich mir, dass die andere methode viel eleganter aussieht
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 01.01.05 23:32 
Das ist leider nicht ist, da Delphi Pointer in Properties verbietet ... Nix anderes würdest Du sonst machen, wenn du keinen Typ angeben ...

Du könntest maximal einen Handler Procedure\Function bauen, die dir immer Records zurückgibt, die den eigentlichen Wert als Extended und die Type-Info enthält.

Dann könntest du normal mit Extendeds rechnen und müsstest für den Ergebnis-Typ nur die beiden Eingabe-Type-Infos auswerten. Am Ende kannst du dann 3 Functions schreiben, die dieses TypeInfo\Extended-Paar als benötigten Ausgabe-Typ umwandeln ...

HTH.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
I.MacLeod
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 109



BeitragVerfasst: So 02.01.05 12:55 
Da fallen mir spontan zwei Möglichkeiten ein. Die erste wäre ein Pointer und reintroduce, die zweite ein Variant.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
type
  TZahl = class(TObject)
  private
    function GetData: pointer; virtualabstract;
    procedure SetData(const Value: pointer); virtualabstract;
  protected
    fData: pointer;
  public
    property Data: pointer read GetData write SetData;
  end;

  TInteger = class(TZahl)
  private
    function GetData: integer; reintroduce;
    procedure SetData(const Value: integer); reintroduce;
  public
    constructor Create;
    destructor Destroy; override;

    property Data: integer read GetData write SetData;
  end;

...

constructor TInteger.Create;
begin
  inherited;
  new(PInteger(fData));
end;

destructor TInteger.Destroy;
begin
  dispose(PInteger(fData));
  inherited;
end;

function TInteger.GetData: integer;
begin
  result := PInteger(fData)^;
end;

procedure TInteger.SetData(const Value: integer);
begin
  PInteger(fData)^ := Value;
end;


Besonders schön oder elegant finde ich das aber nicht, und Variants sind eben ... Variants :-P

//Edit:

dingens korrigiert.
deepgreen Threadstarter
Hält's aus hier
Beiträge: 12


D7
BeitragVerfasst: So 02.01.05 16:35 
Wow danke, genau so hab ich mir das vorgestellt !
Jetzt ist es nämlich möglich Int.Data + Ext.Data zu machen ohne vorher zu Untersuchen welche Funktionen man aufrufen muss, und um hässliche Variants kommt man auch drum rum !

Jetzt hab ich nur noch zwei kurze Fragen

a) TZahl = class(TObject)
Warum schreibst du nochmal TObject dahinter, dachte class heißt immer das man alles von TObject sowieso erbt.

b) procedure SetData(const Value: integer)
Ist das const mit ner bestimmten Begründung dort ?
Weil ich hab es immer als ganz normalen Parameter übergeben


Also, danke nochmal, auch dir Ben, nur ich wollte die Werte nicht umwandeln in Extendeds, da ich damit keine Integeroperationen wie shl und shr etc durchführen kann.
deepgreen Threadstarter
Hält's aus hier
Beiträge: 12


D7
BeitragVerfasst: So 02.01.05 17:49 
Mist war doch nicht ganz was ich dachte, war wohl wieder mal vorschnell.

Was ich meinte das man jetzt 2 variablen vom typen TZahl deklariert, diese dann als TInteger und TExtended von mir aus erstellt und dann hat:

zahl1.data + zahl2.data

Aber seh schon, das geht nicht wie ich mir das dachte, naja egal, hab auf jeden fall wieder was neues dazu gelernt ;)
Maweki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: So 02.01.05 17:52 
ich hab da letztens was drueber gelesen, weiss aber nicht ob das ein 2005er OOP-Feature war. da stand was ueber add und dividepropertys und so...
was passieren soll, wenn man die sachen addiert...

ich such das mal...
wo hab ich denn das nur gelesen?


Edit:
ok, habs gefunden. Geht anscheinend nur auf .NET
www.delphi-source.de...rache/operatoren.php

der letzte Punkt...
sry
I.MacLeod
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 109



BeitragVerfasst: So 02.01.05 22:44 
deepgreen hat folgendes geschrieben:
a) TZahl = class(TObject)
Warum schreibst du nochmal TObject dahinter, dachte class heißt immer das man alles von TObject sowieso erbt.

Joa, ich hab mir das aber so angewöhnt ;-)

deepgreen hat folgendes geschrieben:
b) procedure SetData(const Value: integer)
Ist das const mit ner bestimmten Begründung dort ?
Weil ich hab es immer als ganz normalen Parameter übergeben

IIRC ist das in einigen Fällen schneller, da ein const-Parameter in einer Methode nicht verändert werden kann, und deswegen z.B. von strings keine Kopie angefertigt werden muss. (aber keine Garantie darauf)

deepgreen hat folgendes geschrieben:
Was ich meinte das man jetzt 2 variablen vom typen TZahl deklariert, diese dann als TInteger und TExtended von mir aus erstellt und dann hat:

zahl1.data + zahl2.data

Aber seh schon, das geht nicht wie ich mir das dachte, naja egal, hab auf jeden fall wieder was neues dazu gelernt

Da hilft in Delphi < 8 nur ein Typecast oder der Weg über Variants, fürchte ich. (wobei ich aber auch nicht weiß was passiert wenn man einen Integer-Variant zu einem Extended-Variant addiert. Vermutlich kommt aber ein Extended-Variant raus)

PS: joa, ich hab das mit dem const nochmal nachgeguckt, es geht wohl um strings, records und objects. Hier bei den Pointern wäre es also nicht unbedingt nötig, aber IMHO ist es übersichtlicher wenn alle Getter und Setter den gleichen Aufbau haben. ;-)

In der OH steht:
Using const allows the compiler to optimize code for structured- and string-type parameters.