Zitat von
himitsu:
Du solltest dich dringend mit Objekten und deren Verwendung beschäftigen.
b := TClassB(a);
Ist ein harter TypCast, also man tut so, als wenn A vom Typ TClassB wäre
und erstellt damit keine Kopie!
Es war mir schon klar das es nur die Referenz auf das Objekt ist. Ob es so wirklich sinnvoll ist bin ich mir mittleiweile auch nicht sicher. Der Gedanke war das es in einem Menü mehrere TMenuItems gibt. Diese befinden sich in einem TMainMenu und ich möchte die jeweiligen Shortcuts über eine graphische Komponente vom Benutzer zuordnen lassen. Dafür würde ich meiner Meinung nach direkt mit den TMenuItems arbeiten. Zur Darstellung fehlen mir im TMenuItem jedoch ein paar Zeichenkette für die Anzeige in der Listbox. Die Zeichenketten würde ich gerne im TMenuItem speichern. Da die TMenuItems aber nicht von mir erzeugt werden, bin ich auch damit zufrieden, die Zeichenketten in einer Erweiterung der TMenuItems zu speichern. Dafür wäre die Klasse TClassB gedacht.
Zitat von
fajac:
Hallo martin_
mir scheint, dir ist nicht ganz klar was da passiert. Ich habe deinen Code mal leicht verändert und versucht zu kommentieren, was da "hinter der Bühne" passiert:
Delphi-Quellcode:
type
TClassA = class (TObject)
public
ValueA : Integer;
function Print : AnsiString; virtual;
end;
TClassB = class (TClassA)
public
ValueB : Integer;
ValueC : Integer;
function Print : AnsiString; override;
function PrintEx : AnsiString;
end;
Probier mal beide Varianten aus und lass dich überraschen, was heraus kommt.
Danke für das Beispiel. Mir ist eigentlich nicht ganz klar was bei der function Print passiert. Ohne virtual und oerride, kommt es zu dem Ergebnis das ich erwartet habe. Wird anstelle von override reintroduce verwedet, kommt es zum selben Ergebnis.
Wird nach dieser Stelle
B := TClassB(A);
im Code nachgefragt, ob
B is TClassB
so trifft es zu. Mir fehlt da das Verständnis zwischen override und reintroduce;