Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Klasse inkl. aller Unterklassen als Parameter übergeben (https://www.delphipraxis.net/167619-klasse-inkl-aller-unterklassen-als-parameter-uebergeben.html)

Nico93 9. Apr 2012 21:30

Klasse inkl. aller Unterklassen als Parameter übergeben
 
Hallo zusammen,

leider brauche ich etwas Hilfe.

Ich habe folgende Klassen (Beispiel):

Delphi-Quellcode:
THauptklasse = class
...
end;

TUnterklasseEins = class(THauptklasse)
    Eigenschaft1: string;
    Eigenschaft2: string;
end;

TUnterklasseZwei = class(THauptklasse)
    Eigenschaft1: string;
    Eigenschaft2: string;
end;
Optimal wäre es jetzt wenn man es irgendwie schaffen könnte, eine Instanz der THauptklasse zu erzeugen und darüber auf die Unteklassen zugreifen könnte, sodass ich bei einem Aufruf einer Prozedur nur die THaupsklasse als Paramter übergeben muss und gleichzeitig die beiden Unterklassen mitübergeben habe.

Beispiel:
Delphi-Quellcode:
....
interface
...
type TTest = class
private
   procedure eins(Hauptklasse: THauptklasse);
   procedure zwei();

end;

implementation

TTest.zwei()
var
  Haupt: THauptklasse;
begin
  Haupt := THauptklasse.Create;
  //Jetzt wäre es gut wenn man irgendwie wie auf eine Eigenschaft der klasse zugreifen könnte. Beispiel:
  Haupt.TUnterklasseEins.Eigenschaft1 := ......;
  eins(Haupt);
end;

TTest.eins(Hauptklasse: THaupsklasse)
var
  test: string;
begin
  //Hier wäre es gut wenn nicht nur die THauptklasse übergeben werden würde, sondern auch die Untergeordneten Klassen und man so über das o. g. Prinzip auf dessen Eigenschaften zugreifen könnte. Beispiel:
  test := Hauptklasse.TUnterklasseEins.Eigenschaft1;
end;
Vielen Dank für die Hilfe und hoffe, dass ich es relativ verständlich erklärt habe, was mein Problem ist.

implementation 9. Apr 2012 21:45

AW: Klasse inkl. aller Unterklassen als Parameter übergeben
 
Wie wäre es mit sowas?
Delphi-Quellcode:
type
  TElternklasse = class;

  TKindklasse1 = class(TElternklasse)
    ...
  end;

  TKindklasse2 = class(TElternklasse)
    ...
  end;

  TElternklasse = class
  private
    FKind1: TKindklasse1;
    FKind2: TKindklasse2;
  public
    property Kind1: TKindklasse1 read FKind1;
    property Kind2: TKindklasse2 read FKind2;
  end;

swkevin08 9. Apr 2012 22:00

AW: Klasse inkl. aller Unterklassen als Parameter übergeben
 
Schau dir mal die Abstrakten Klassen an. Dabei sollte deine Hauptklasse(abstrakte) eine methode (in deinem beispiel "eins") beinhalten. Dann bastelst dir beliebig viele unterklassen.

jetzt übergibst du als parameter die abstrakte Klasse, rufst die abstrakte methode auf und fertisch^^

gruß

himitsu 9. Apr 2012 22:06

AW: Klasse inkl. aller Unterklassen als Parameter übergeben
 
Wobei die Vererbung der Kindklassen von der Hauptklasse noch etwas fragwürdig ist.

Falls die Kinder Gemeinsamkeiten haben, dann eine eigene Vorfahrklasse für die Kinder.
Ansonsten kommt man hier wohl auch ohne Vererbung aus.

Falls auch mal mehr Kindklassen möglich sind, dann diese auch verwerben, selbst wenn physisch nichts vererbt wird, außer daß es alle Kinder sind.
Und dann die Kinder in eine Liste und nicht unbedingt je in ein eigenes Property.

Nico93 9. Apr 2012 22:41

AW: Klasse inkl. aller Unterklassen als Parameter übergeben
 
Vielen Danke für die schnelle Hilfe.
Das wars, was ich gesucht habe.

vagtler 10. Apr 2012 06:05

AW: Klasse inkl. aller Unterklassen als Parameter übergeben
 
Zitat:

Zitat von Nico93 (Beitrag 1160872)
[...] eine Instanz der THauptklasse zu erzeugen und darüber auf die Unteklassen zugreifen könnte, sodass ich bei einem Aufruf einer Prozedur nur die THaupsklasse als Paramter übergeben muss und gleichzeitig die beiden Unterklassen mitübergeben habe. [...]

Ich werde den Eindruck nicht los, dass hier gedanklich (noch) keine klare Trennung zwischen Klassen und Instanzen stattgefunden hat...

Furtbichler 10. Apr 2012 07:29

AW: Klasse inkl. aller Unterklassen als Parameter übergeben
 
Zitat:

Zitat von implementation (Beitrag 1160874)
Wie wäre es mit sowas?
Delphi-Quellcode:
type
  TElternklasse = class; // <<--- Diese Zeile ist markiert (siehe Frage weiter unten)

  TKindklasse1 = class(TElternklasse)
    ...
  end;

  TKindklasse2 = class(TElternklasse)
    ...
  end;

  TElternklasse = class
  private
    FKind1: TKindklasse1;
    FKind2: TKindklasse2;
  public
    property Kind1: TKindklasse1 read FKind1;
    property Kind2: TKindklasse2 read FKind2;
  end;

Wozu dient die Vorwärtsdeklaration? (markierte Zeile)?

vagtler 10. Apr 2012 07:39

AW: Klasse inkl. aller Unterklassen als Parameter übergeben
 
Zitat:

Zitat von Furtbichler (Beitrag 1160889)
[...] Wozu dient die Vorwärtsdeklaration? (markierte Zeile)?

Damit es kompiliert... ;)

Lemmy 10. Apr 2012 07:47

AW: Klasse inkl. aller Unterklassen als Parameter übergeben
 
Zitat:

Zitat von vagtler (Beitrag 1160890)
Zitat:

Zitat von Furtbichler (Beitrag 1160889)
[...] Wozu dient die Vorwärtsdeklaration? (markierte Zeile)?

Damit es kompiliert... ;)

wobei es imho besser wäre, wenn so was nicht kompiliert werden könnte....

Blup 10. Apr 2012 08:35

AW: Klasse inkl. aller Unterklassen als Parameter übergeben
 
Ich denke hier ist einfach ein Cast angebracht:
Delphi-Quellcode:
TTest.eins(Hauptklasse: THaupsklasse)
var
  test: string;
begin
  //Hier wäre es gut wenn nicht nur die THauptklasse übergeben werden würde, sondern auch die Untergeordneten Klassen und man so über das o. g. Prinzip auf dessen Eigenschaften zugreifen könnte. Beispiel:
  if Hauptklasse is TUnterklasseEins then
    test := TUnterklasseEins(Hauptklasse).Eigenschaft1
  else if Hauptklasse is TUnterklasseZwei then
    test := TUnterklasseZwei(Hauptklasse).Eigenschaft1;
end;
Wie schon gesagt, wenn es sich im Prinzip um die selben Eigenschaften handelt, könnte man diese auch abstract in der Basisklasse deklarieren. Eine anderer Weg ist die gleichartigen Eigenschaften und Methoden zu einem Interface zusammen zu fassen und bei Bedarf abzufragen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz