Thema: Delphi Ist das schon Klasse?

Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.613 Beiträge
 
#15

Re: Ist das schon Klasse?

  Alt 6. Nov 2007, 07:42
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat