![]() |
Delphi-Version: 7
Eine Frage an die Cracks: erben
Ich erkläre gerade einem in einem anderen Forum etwas und will mit meinem nicht vorandenem Wissen prallen.
Also, ich erstelle meine eigene Klasse und leite sie aus einer anderen Klasse ab:
Delphi-Quellcode:
Jetzt die Frage: erstelle ich nur eine Verbindung zu der anderen Klasse plus meiner Methode oder eine Kopie von der anderen Klasse inc. meiner Methode?
type
TMyBitmap = class(TBitmap) function QuadratPixel: Integer; end; Nochmal: wenn ich meine Klasse erstelle, dann erbt meine Klasse alles von der Vorgänger-Klasse. Meine Frage bezieht sich drauf wie dieses Erben intern aussieht. Wird bei der Erstellung meines Objekts nur mein Einzeiler beachtet mit dem höflichen Vermerk, für den Rest mal bitte schön irgendwo bei der TBitmap zu gucken, oder es wird eine komplett neue Superklasse kreiert, die die Bitmap beinhaltet plus meine Methode. Oder wird einer Art Container erstellt der, um bei der Bitmap zu bleiben, alle sechs Klassen (meinetwegen Abbildungen) beinhaltet (jede schön für sich separat). Wie sieht der Vorgang des Erbens eigentlich aus? |
AW: Eine Frage an die Cracks: erben
Ich schätze mal der eigentliche Code, also alle Methoden sind irgendwo statisch im Code gelinkt. Wenn ich mich recht erinnere wird vor dem Aufruf einer Methode die Instanz in ECX abgelegt. Also rein von dem Standpunkt aus gesehen erstellst du keine Kopie, sondern nur eine Erweiterung. Für die Klassendeklaration ansich gillt das selbe, wobei ich hier nicht ganz genau weiß, wie es bei virtuellen Methoden aussieht.
Prinzipiell gesehen trifft deine Beschreibung mit dem "höflichen Vermerk" wohl am besten zu. |
AW: Eine Frage an die Cracks: erben
Soweit ich weiß, erbst du mit dem Erstellen einer neuen Klasse aus einer vorhandenen alle Methoden und Properties. Es wird also eine neue eigenständige Klasse angelegt, die alle Methoden und Properties der Eltern-Klasse enthält, weil sie die eben geerbt hat. Führst du neue Methoden und Properties ein, erweiterst du deine neue Klasse um dieselben. Wählst du für eine neue Methode oder ein neues Property einen Variablen-Namen, der bereits in der Eltern-Klasse für eine Methode oder ein Property Verwendung fand, überschreibst du diese Methode bzw. dieses Property nur in deiner neuen Klasse, nicht in der Elternklasse. Für alle Methoden und Properties, die unverändert von der Eltern- in die Kindklasse übernommen werden, existieren selbstverständlich keine Kopien für deine neue Klasse, sondern lediglich Referenzen auf die Elternklasse. Wenn du das aus irgend einem Grund nicht willst, mußt du dir den gesamten Code der Elternklasse in deine neue Klasse kopieren. Das wäre letztlich aber nicht im Sinne der Vererbungstechnik.
Meine Einschränkung "soweit ich weiß" bezieht sich auf meine einzige Erfahrung mit der Vererbung einer Klasse, als ich vor einiger Zeit eine TjvRichText-Komponente geklont habe, um ihr diverse neue Methoden zu verpassen. Natürlich besteht die Funktionalität der neuen Klasse auf dem Vorhandensein der alten: Ohne Jedi-Komponenten würde meine neue Klasse nicht funktionieren, weil dann der Vererbungsvorgang scheitern würde. |
AW: Eine Frage an die Cracks: erben
Zitat:
Jede Form die du erstellst ist eine Ableitung einer Klasse (TForm) die du entsprechend erweiterst. ;) |
AW: Eine Frage an die Cracks: erben
Zitat:
|
AW: Eine Frage an die Cracks: erben
Zitat:
Ich hätte schreiben sollen "abgesehen von automatischer Vererbung beim Erstellen einer Form". |
AW: Eine Frage an die Cracks: erben
Zitat:
|
AW: Eine Frage an die Cracks: erben
Muss man das nicht trennen nach Feldern und Methoden? Sprich was passiert bei Vererbung mit Feldern, sprich welcher Speicher wird wo wofür reserviert! Und wie werden die Methoden zugeordnet? Gibt es da nicht irgendwelche Tabellen (Mir schwirrt aus der Schule noch das Stichwort Method-Table im Kopf rum) wo (vom Compiler?) geguckt wird, welche Methode gerade gefragt ist (Polymorphie)?
|
AW: Eine Frage an die Cracks: erben
Machen wir ein simples Experiment
Delphi-Quellcode:
Führe ich das Schritt für Schritt aus, dann lande ich nicht in meiner geerbten Methode von TMyBitmap, die physikalisch nicht da ist, sondern von TBitmap. Die Frage ist nur was da abläuft. Entweder dem Debuger fällt die Alternative, also greift er zum zeigen auf die Methode von TBitmap, oder was wohl wahrscheinlich ist, TMyBitmap erbt nicht die Methode, sondern nur ihre Adresse drau. Die Klasse hat nichts geerbt, sondern nur die Adresse des Vorgängers und gibt den Auftrag an den Vorgänger weiter. Oder kann man das so deuten: die Klasse hat schon alles geerbt, aber nur theoretisch. Aber wozu die Methode zwei mal im Speicher haben wen die vom Vorgänger identisch ist.
type
TMyBitmap = class(TBitmap) end; procedure TForm1.Button2Click(Sender: TObject); var MyBitmap: TMyBitmap; begin MyBitmap:= TMyBitmap.Create; MyBitmap.LoadFromFile('c:\abc.bmp'); end; Natürlich sehe ich was ich sehe, mich interessiert eher die Philosophie dahinter. |
AW: Eine Frage an die Cracks: erben
Es wäre ja unsinnig, dass beim Vererben der komplette Code kopiert wird. Wird eine Methode der superklasse nicht verdeckt, wird natürlich die der Superklasse aufgerufen ( referenziert).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz