Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   eine Klasse mit zwei Vorfahren, geht das? (https://www.delphipraxis.net/214851-eine-klasse-mit-zwei-vorfahren-geht-das.html)

Marco Steinebach 19. Mär 2024 17:13

eine Klasse mit zwei Vorfahren, geht das?
 
Hallo zusammen,
Ich habe zwei Klassen, die eine von TEdit abgeleitet, die andere von TCombobox. Beide sollen mehrere neue Eigenschaften erhalten, die ich gern auch in einer Klasse speichern würde, also für beide die selben Eigenschaften. Nennen wir sie TNew.
Kann ich das irgendwie elegant lösen?
Sprich hätte meine neue Klasse
TMyEdit dann TEdit und TNew als Vorfahren und würde beide vereinen.

Herzlich grüßt
Wandogau

himitsu 19. Mär 2024 17:40

AW: eine Klasse mit zwei Vorfahren, geht das?
 
Nein, Mehrfachvererbung gibt es nicht.

Was geht, ist in beiden Komponenten ein gemeinsames Interface zu implementieren, für den Zugriff auf diese Eigenschaften.

Beachte: Interfaces bei TComponent-Nachfahren haben keine Referenzzählung, also es ist ratsam die Interface-Variable dann immer nur kurz bei Verwendung deklariert zu haben und anschließend sofort wieder freizugeben.



Wirklich Delphi 5?

PS: Seit 'ner Weile kann man (wenn man sich sicher ist, dass eine Interface unterstützt wird), das Objekt einfach mit AS ins Interface casten.
Delphi-Quellcode:
procedure TForm25.FormDblClick(Sender: TObject);
begin
  var C := (Self as IInterfaceComponentReference).GetComponent;
end;

jaenicke 19. Mär 2024 18:05

AW: eine Klasse mit zwei Vorfahren, geht das?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es gibt eine Möglichkeit. Die ist zwar auch nicht ohne zusätzlichem Aufwand, aber sehr elegant zu nutzen:
Schieb die Zusatzproperties einfach in eine eigene Klasse und koppele diese mit implements. Beispiel anbei.

QuickAndDirty 20. Mär 2024 11:12

AW: eine Klasse mit zwei Vorfahren, geht das?
 
Mittels Interface kannst du machen das beide KLassen in der selben variable gespeichert werden können oder mit den selben parametern kompatibal sind.
Evtl ist es möglich über THelperComponent oder so ähnlich beide klassen um die fähigkeiten einer helperklasse zu erweitern.

Vererbung hat seit einigerzeit eh ein Popularitätsproblem und viele sagen man sollte Klassen lieber mittels Komposition um weitere Fähigkeiten erweitern.
So gesehen könntest du ein TNewControl auch einfach Objekte beider Klassen besitzen lassen und auf diese weise beide Verhalten exposen...

Rollo62 20. Mär 2024 11:28

AW: eine Klasse mit zwei Vorfahren, geht das?
 
Zitat:

Zitat von jaenicke (Beitrag 1534852)
Es gibt eine Möglichkeit. Die ist zwar auch nicht ohne zusätzlichem Aufwand, ...

:thumb:

Das finde ich aber sowas von gar nicht, das ist nur EINMAL etwas mehr Aufwand,
dafür kann dann aber allen deinen Komponenten ein gewünschtes Verhalten zugeordnet werden.
Das ist meiner Meinung nach den leichten Mehraufwand allemal Wert. :-D

Dafür kannst du das nutzen, um
- Zusätzliche Funktionen bereitzustellen ( Sicherheitsabfragen, Verifizieren, ... )
- Fehler in den Basiskomponenten abfangen und fixen
- Komponenten über verschiedene Versionen anpassen und gleiches Verhalten herstellen
- Ein gemeinsames, neues Verhalten für mehrere Komponenten zu implementieren (z.B. Styling, Logging, ...)
- Alles das, ohne neue Custom-Komponenten anlegen und pflegen zu müssen (funktioniert auch ohne Installation von KomponentenPackages)
- uvm.

jaenicke 20. Mär 2024 12:26

AW: eine Klasse mit zwei Vorfahren, geht das?
 
Ich finde auch, dass es den Aufwand wert ist. Das war nicht negativ gemeint.

Sehr entscheidend ist noch ein anderer Aspekt:
Du kannst die auf diese Weise angedockte Funktionalität nicht nur zur Laufzeit ändern, was bei Vererbung nicht möglich wäre, sondern du kannst sogar im Getter der Property entscheiden, welche Referenz du zur Ausführung zurück lieferst.

Marco Steinebach 25. Mär 2024 06:39

AW: eine Klasse mit zwei Vorfahren, geht das?
 
Hallo zusammen,
Herzlichen Dank für eure Antworten. Na dann: auf zum Lesen!
Herzlich grüßt
Wandogau


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 Uhr.

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