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/)
-   -   Delphi Komponentenableitung Vererbung Property (https://www.delphipraxis.net/211454-komponentenableitung-vererbung-property.html)

Blitzschutz1 18. Sep 2022 19:12


Komponentenableitung Vererbung Property
 
Ich steh' mal wieder auf dem Schlauch:

TMaskEdit ist von TCustomMaskEdit abgeleitet und TCustomMaskEdit von TCustomEdit. Soweit so gut.
Aber warum sehe ich dann bei TMaskEdit das Property NumbersOnly nicht mehr. Ich denke, ein Nachfahr erbt alle
Eigenschaften usw. vom Vorgänger und man kann z.B. ein Property, das beim Vorfahr vorhanden ist, im Nachfahr nicht
"weglassen" (jedenfalls nicht ohne Tricks...).

Oder habe ich da wieder was falsch auf dem Schirm?

DeddyH 18. Sep 2022 19:41

AW: Komponentenableitung Vererbung Property
 
Ich habe gerade kein Delphi zur Hand, aber in vielen TCustomXXX-Komponenten sind diverse Properties als protected deklariert und die Sichtbarkeit erst in den Nachfahren erhöht. Das heißt aber nicht, dass die Nachfahren dies mit allen Properties tun. Wenn nicht, bleiben diese halt protected und sind somit von außen nicht sichtbar.

himitsu 19. Sep 2022 09:33

AW: Komponentenableitung Vererbung Property
 
Genau, man erbt alle Eigenschaften, aber wenn sie ausgeblendet (protected) sind, ist man nicht gezwungen sie zu benutzen (nur intern oder nach public/publiched verschoben).

NumbersOnly macht beim Maskedit keinen Sinn, da es als "Text"-Edit konzipiert ist,
aber dort kannst du das "nur nummern" auch mit der Maske regeln.

Oder du leitest selber nochmal von TCustomMaskEdit/TMaskEdit ab und implementiersts das mit dem NumbersOnly.




Sowas passiert öfters mal. Einige gemeinsame Funktioninen sind in Basisklassen implementiert (noch versteckt), bzw. sie haben zumindestens die Schnittstelle dafür (aber noch keine Funktion),
und in vielen Nachfahren wird es dann sichtbar gemacht, bzw. das leere Interface (virtual/abstract) wird dann mit Code gefüllt.
Aber wer das nicht braucht, lässt es eben einfach weg und versteckt es weiterhin (protected) ... siehe TMaskEdit und NumbersOnly :stupid:



Zitat:

Ich denke, ein Nachfahr erbt alle
Eigenschaften usw. vom Vorgänger und man kann z.B. ein Property, das beim Vorfahr vorhanden ist, im Nachfahr nicht
"weglassen" (jedenfalls nicht ohne Tricks...).
Im Prinzip richtig.

Klar, man kann Dinge von public/published auch wieder ins private/protected verschieben,
aber erstmal meckert dann der Compiler (manchmal funktioniert es auch einfach nicht und bleibt sichtbar ... k.A. warum)
und außerdem kommt man über einen Cast in einen Vorfahren dennoch ran.

Und außerdem wird hier nichts weggelassen, denn es war ja niemals öffentlich sichtbar, also ist alles vollkommen korrekt.

Blitzschutz1 19. Sep 2022 10:18

AW: Komponentenableitung Vererbung Property
 
Ja, Ihr habt beide recht! Die Eigenschaft NumOnly ist in der Klasse TCustomEdit als protected deklariert:

Code:
 
Vcl.StdCtrls

TCustomEdit = class(TWinControl)
.
.
.
protected
.
.
.
property NumbersOnly: Boolean read FNumbersOnly write SetNumbersOnly default False;
property PasswordChar: Char read FPasswordChar write SetPasswordChar default #0;
.
.
.
Mein Problem eines eigenen TMaskEdit war, dass ich von TEdit abgeleitet habe und hatte dann dieses NumOnly-Property (wie auch PassworChar) automatisch mit in den Eigenschaften. Also werde ich mal von TCustomEdit ableiten, muss dann halt alle Eigenschaften, die ich von TEdit benötige, selber implementieren. Aber es gibt ja die Sourcen...

Schöne Woche!

himitsu 19. Sep 2022 11:04

AW: Komponentenableitung Vererbung Property
 
Selber implementieren (inkl. Programmcode/Funktion) ist ja bei Vielem nicht nötig, abgesehn von der verschobenen Deklaration.

Delphi-Quellcode:
published
  property NumbersOnly; // ohne den Typen ": Boolean"
und ohne dem read/write, wenn man da nichts ändern will, wie z.B. eigener Setter


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 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