Gewusst wie: überschreiben einer geerbten Immobilie?
Habe ich eine class (TMyClass) die eine Eigenschaft (Artikel: TItems)
TItems = class;
TMyClass = class(TComponent)
private
FItems: TItems;
procedure SetItems(const Value: TItems);
protected
public
protected
property Items: TItems read FItems write SetItems;
end.
TExItems = class(TItems)
private
FNewProb: Integer;
protected
public
published
property NewProp: Integer read FNewProb write FNewProb;
end.
TExMyClass = class(TMyClass)
private
FItems: TExItems;
procedure SetItems(const Value: TItems);
protected
public
published
property Items: TExItems read FItems write SetItems;
end.
Den neuen "Items" - Eigenschaft wird vererbt von TItems, aber wenn ich installiert die Komponente die neue Eigenschaft TExItems die "NewProb" nicht angezeigt und es sieht aus wie die "Items" - Eigenschaft ist immer noch TItems nicht TExItems...wie um es zu überschreiben?
Dank
Änderung :
Hier ist der code der
geben
TKHAdvSmoothDock = Klasse;
TKHAdvSmoothDockItem = class(TAdvSmoothDockItem)
private
FImageIndex: TImageIndex;
procedure SetImageIndex(const Value: TImageIndex);
protected
public
published
property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1;
end;
TKHAdvSmoothDockItems = class(TAdvSmoothDockItems)
private
FOwner: TKHAdvSmoothDock;
FOnChange: TNotifyEvent;
function GetItem(Index: Integer): TKHAdvSmoothDockItem;
procedure SetItem(Index: Integer; const Value: TKHAdvSmoothDockItem);
protected
function GetOwner: TPersistent; override;
public
constructor Create(AOwner: TKHAdvSmoothDock);
function Add: TKHAdvSmoothDockItem;
function Insert(Index: Integer): TKHAdvSmoothDockItem;
property Items[Index: Integer]: TKHAdvSmoothDockItem read GetItem write SetItem; default;
procedure Delete(Index: Integer);
published
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
TKHAdvSmoothDock = class(TAdvSmoothDock)
private
FImageChangeLink: TChangeLink;
FImages: TCustomImageList;
FItems: TKHAdvSmoothDockItems;
procedure ImageListChange(Sender: TObject);
procedure SetImages(const Value: TCustomImageList);
procedure SetItems(const Value: TKHAdvSmoothDockItems);
function GetItems: TKHAdvSmoothDockItems;
{ Private declarations }
protected
procedure UpdateImagesFromImageList;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Images: TCustomImageList read FImages write SetImages;
property Items: TKHAdvSmoothDockItems read GetItems write SetItems;
end;
Grüße.
Auch, um etwas in der Delphi-IDE, sollten Sie beginnen, von der Klasse TPersistent -
Der neue code, den Sie eingeschlossen habe, enthalten nicht die Klassen miteinander in Beziehung stehen, also, was tun Sie haben zu tun mit "überschreiben" etwas? Sie enthalten auch viele Dinge, die wahrscheinlich in keinem Zusammenhang zu Ihrer Frage. Bitte achten Sie darauf, dass Sie post ein minimal Beispiel also nicht ablenken vom eigentlichen Thema.
Herzlich willkommen auf Stack Overflow. Beachten Sie, dass Sie müssen nicht ein Experte sein, um zu Stapeln-Übersicht in, um zu Fragen, gute Fragen hier. Die Techniken, die für das stellen guter Fragen sind universell. Sie würde vor den gleichen Problemen, wenn Sie wurden per e-Mail an einen Freund. Dein Freund könnte mehr leicht, wenn Sie einen Fehler machen, aber er konnte immer noch nicht die Antwort auf Ihre Frage nur die Informationen, die Sie gegeben haben, hier so weit.
Der neue code, den Sie eingeschlossen habe, enthalten nicht die Klassen miteinander in Beziehung stehen, also, was tun Sie haben zu tun mit "überschreiben" etwas? Sie enthalten auch viele Dinge, die wahrscheinlich in keinem Zusammenhang zu Ihrer Frage. Bitte achten Sie darauf, dass Sie post ein minimal Beispiel also nicht ablenken vom eigentlichen Thema.
Herzlich willkommen auf Stack Overflow. Beachten Sie, dass Sie müssen nicht ein Experte sein, um zu Stapeln-Übersicht in, um zu Fragen, gute Fragen hier. Die Techniken, die für das stellen guter Fragen sind universell. Sie würde vor den gleichen Problemen, wenn Sie wurden per e-Mail an einen Freund. Dein Freund könnte mehr leicht, wenn Sie einen Fehler machen, aber er konnte immer noch nicht die Antwort auf Ihre Frage nur die Informationen, die Sie gegeben haben, hier so weit.
InformationsquelleAutor user1512094 | 2012-07-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigenschaft Getter und setter können virtuell sein, und dann außer Kraft gesetzt, durch die Erben von Klassen, siehe unten das Beispiel aktualisiert. Es gibt eine Einschränkung mit du Beispiel-code, und Sie versuchen, ändern Sie den Typ der Eigenschaft, die nicht erlaubt ist. Ich würde Ihnen raten, schauen Sie für
Value is TExItems
imTExMyClass.SetItems
aber verwenden Sie die geerbte Eigenschaft Items und cast zu TExItems in allen Methoden derTExMyClass
und weitere Erben.Wie ich schon sagte, die änderung der Art der Immobilie beim Erben ist nicht zulässig. Überprüfen Sie den Typ aus, wenn die Einstellung und Verwendung von
Items as TExItems
sollte aber funktionieren.InformationsquelleAutor Stijn Sanders
Eigenschaften können nicht virtuell sein, damit Sie nicht überschrieben werden kann. Sie können versteckt, in, dass im Rahmen von
TExMyClass
Verweise aufItems
löst auf die Eigenschaft erklärt, die in dieser Klasse nicht deklariert Vorfahren.Wenn Sie etwas deren statische (deklarierte, compile-time) Typ
TMyClass
,Items
beziehen sich immer auf die eine von dieser Klasse, auch wenn seine run-time-Typ istTExMyClass
.Könnten Sie erklären
SetItems
als protected und virtual in der Basisklasse, und überschreiben Sie es in der Nachkomme, anstatt zu erklären, eine ganz neue Eigenschaft, die zufällig den gleichen Namen haben.InformationsquelleAutor Rob Kennedy
Können Sie implementieren und überschreiben die Methoden getItem und setItem;
Implementieren Eigenschaft Item nur für TMyClass
Für TMyClass:
Für TExMyClass:
so, TExMyClass.Elemente.className = TExItems !
InformationsquelleAutor TheHorse
Technisch kann man nicht überschreiben einer Eigenschaft, aber Sie können nachahmen, überschreiben, gibt es verschiedene Möglichkeiten. Siehe zum Beispiel diese Antwort für die grundlegendsten Umgangsformen.
Nun ich habe nicht den code für
TAdvSmoothDock
so der rest ist nur zu raten. Wenn die Eigenschaft getter-und setterTAdvSmoothDock.Items
virtuell sind, könnte man überschreiben Sie. Aber in anspruchsvolleren Komponenten, und ich nehme an, diejenigen, die von TMS sind, dann gibt es eine gute chanceTAdvSmoothDock
mit einem geschütztenCreateItem
Methode, die aufgerufen wird, wenn es Bedarf einer neuen Sache, die könnten überschrieben werden. Wenn das der Fall ist, dann sollten Sie es implementieren wie:Und verwenden Sie es wie:
Sie könnten, aber es ist eine schlechte Idee, weil es brechen würde-Vererbung: d.h. wenn die Vorfahren ruft die setter-oder getter, Ihre würde nicht aufgerufen werden.
InformationsquelleAutor NGLN
Ist es das gleiche problem wie der Versuch, mehr als ein TMemo, verwendet die gleichen Linien-Objekt.
Seit
TCustomMemo
delcares auf seineprivate
AbschnittFLines: TStrings;
ist es nicht möglich, mehr als ein TMemo, verwendet die gleichenFLines
.Nur so (weiß ich noch) zu arbeiten, ist die vollständig duplizieren die ganze
TCustomMemo
Klasse alsTLinkedCustomMemo
, aber die DefinitionFLines: TStrings;
auf den öffentlichen Bereich; müssen auch das Klonen der "TMemo", sondern verweisen aufTLinkedCustomMemo
, nichtTCustomMemo
Dann mit dem hack von delcaring
TMemo=class(TLinkedMemo)
Sie haben den Zugang der öffentlichkeit zuFLines
, so können Sie ersetzen das Objekt, mit dem Objekt der main TMemo, auf den ganzen rest verknüpfte memos.Warum ein solcher Link auf die Inhalte der TMemos?
Einfache Antwort könnte sein: mehr als ein TMemo, zeigt den gleichen text, so dass Benutzer können sehen (und Bearbeiten) von zwei (oder mehr) verschiedenen teilen zu einer Zeit, wie einige Tabellen zu tun... es in der Regel auch um eine horizontale splitter zwischen Ihnen, die Synchronisierung horizontale scrollbars, etc.
Manchmal tut etwas, das scheint so einfach, es ist wirklich so kompliziert!
Nur verursacht durch fehlerhafte VCL-design.
Für die Stichprobe der TMemos... warum in der Hölle Sie nicht definiert wurden seine Linien-Eigenschaft basierend auf TStringList insead von TStrings? So konnten wir das gleiche String-Liste für mehr als ein TMemo zur gleichen Zeit.
Wenn Sie wollen, um zu sehen, wie intern ist abhängiger darauf, wie... suchen für Klasse
TMemoStrings
(es erscheint auf der implementation-Abschnitt von StdCtrls). Warum muss es nur ein TMemo?, und warum muss es überhaupt? warum nicht hatte TStringList-Objekt verwendet, anstatt alle, dass die Hölle?Wenn manche Klassen sind so geschlossen... es kommt der hacken Weg, deklarieren von Klassen... aber wie ändern Sie nur eine Eigenschaft eines Steuerelements, ohne dass ganze duplizieren einige Klassen (nur so wenig ändern sich die Dinge)?
Oh, ja, eine real-life-Beispiel für eine content-verknüpftes memo sein könnte:
Setzen Sie also zwei TMemo und link, die Linien-Eigenschaft, so dass Benutzer die Steuerelemente zum Bearbeiten solcher Linien Eigentum (an verschiedenen Punkten) von beiden memo-ohne scrollen zu müssen) nach unten und bis in alle Zeiten.
Anderes Beispiel:
copy
ist nicht möglich, mehr als 3GiB RAM auf einem 32Bit Windows (nicht erlaubt), jedes Memo müssten >1.6 GB ram... usw.-etc
Gibt es so viel Proben... und die wichtigsten sind diejenigen, die ich nicht verstehen.
Also die Beantwortung Ihrer Frage in allgemeiner form, "how to hack a-Klasse, um es ein wenig modifizieren":
TTheClass=class(TheUnit.TTheClass)
), sonst verwenden Sie einen anderen Namenuses
voninterface
AbschnittIst es... einfach zu sagen, die harte Arbeit zu tun, auf einige Fälle.
Ich immer empfehlen nes-Klassen-Namen, außer, wie auf der Probe hinzufügen
Alignment
- Eigenschaft, um einTEdit
.Wenn Sie das hack Erklärung? Wenn Sie eine volle Anwendung der bereits codiert und wollen Sie auf hinzufügen, um alle
TEdit
es auf die Ausrichtung... insetead erstellen Sie eine neue Komponente hinzufügen Komponente tools, neu definieren Sie alle Formulare nicht verwenden:TEdit;
und verwenden:TMyAlignedEdit
... Sie können einfach hinzufügen, verwendet Ihr Gerät und voila... alleTEdit
haben jetzt solche Eigenschaft und IDE inspertor auch sieht es, etc.InformationsquelleAutor Claudio