Zitat von
Gonzo2:
Somit habe ich entweder das alte Problem oder nicht 100% das Gleiche, denn entweder nutze ich die Klassenmethode, dann gehe ich nicht über ein Objekt, sondern über die Klasse, so habe ich es zumindest aus den in den Links beschriebenen Kursen verstenden, muß aber die Klasse davorschreiben, oder ich nutze Create. Es ist dann doch ein kleiner Unterschied zu dem ersten Beispiel von mir in dem ich es weder als Klassenmethode deklariert habe, dafür abe ohne Create mit der Variable auf dei Prozedur zugegriffen habe.
Ich weiß, ich bin eine Klette am A., aber ich würde es gerne 100% und ohne einen Hauch Zweifel verstehen.
Nix gegen Kletten. Mir ist jemand lieber der sich damit intensiv auseinandersetzt als jemand der meint, er hätte es kapiert und dann doch noch Fehler macht
Dir fehlt glaub ich noch ein klein wenig Hintergrundinfo.
Also ganz grob:
Delphi-Quellcode:
var
objektvariable: TKlasse;
erstellt einen Bereich im Speicher, der einen Pointer aufnehmen kann. Das Ding hat aber erstmal einen ungültigen Wert.
objektvariable := TKlasse.Create();
erstellt zuallererstmal einen Bereich im Speicher für das neue Objekt dieser Klasse - und gibt einen Pointer auf dieses Objekt zurück. Der Code im Konstruktur wird dann ausgeführt, wobei 'Self' auch auf den Objektspeicher zeigt. In diesem Objektspeicher ist allerdings nicht nur ausschliesslich der Platz für die Variablen (Felder) des Objektes reserviert. In diesem Objektspeicher ist auch ein Pointer auf den Codebereich der Klasse hinterlegt. Erst jetzt zeigt die
objektvariable auf ein vollständiges gültiges Objekt.
Das hat folgenden Hintergrund:
Delphi-Quellcode:
var
control: TControl;
begin
control := TLabel.Create(self);
// Label erzeugt, aber auf Control zugewiesen
control.Parent := self;
if control
is TLabel
then
begin
TLabel(control).Caption := '
Wuppdi';
end;
end;
Es wird auf eine Objektvariable ein Objekt erzeugt, das gar nicht dieses Objekt ist, sondern davon abgeleitet wurde. Das ganze nennt sich Kovarianz. Das funktioniert, weil TLabel ja alle Eigenschaften von TControl erbt.
Weil ja Om objektspeicher auch ein Verweis auf die eigentliche Klasse steckt, funktioniert die Abfrage ob das control ein Label ist und auch der Cast.
Aus genau dem Grund kann Dein Beispiel
Delphi-Quellcode:
var
objektvariable: TKlasse;
begin
objektvariable.Machwas();
end;
nicht funktionieren: objektvariable KÖNNTE ja auf eine TKlasse zeigen - oder aber auch auf ein TIrgendwasAbgeleitetVonTKlasse. Da das der computer ja nicht wissen kann müsste er auf jeden Fall erstmal in das Objekt reingucken was hier referenziert wird um dann die richtige Methode auszuführen. Machwas() könnte in einer Ableitung ja auch überschrieben worden sein.
Der Aufruf direkt auf der Klasse muss funktionieren, weil hier ja keine andere Klasse in Frage kommen kann.
Wenn Du wie in Deinem letzten Beispiel ein konkretes Objekt erzeugst ist damit auch die entsprechende Klasse festgelegt - und damit auch klar, welcher Code dahintersteckt.