Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - OOP Grundlagenfrage
baphumet - Do 08.10.09 16:21
Titel: OOP Grundlagenfrage
Also ich kenn den Unterschied zwischen dynamischen und virtuellen Methoden, der Unterschied zwischen überladen(overload) und überscheiben(override) ist mir auch klar, mit dem Befehl as kann ein Typcast durchgeführt werden und durch is eine Abfrage vorgenommen werden ob ein Objekt ein Objekt einer bestimmten Klasse ist. Mit dem Befehl abstract wird eine Methode als abstrakt definiert, wird also in entsprechender Klasse nicht implementiert, sondern in den abgeleiteten
Das einzige was mir ein Rätsel bleibt ist der Befehl inherited, selbst die Hilfe nutzt mir da nichts und bei properties blick ich auch nicht völlig durch. Ich kapier properties soweit, das es das Prinzip information hiding unterstützt und mit diesen Lese- bzw. Schreibzugriffe auf die Attribute einer Klasse möglich sind, aber was sagen die Parameter (default, nodefault) im Klartext aus und wie funktioniert das überschreiben bzw. überladen von properties.
mkinzler - Do 08.10.09 16:24
inherited ruft die ererbte Methode auf
baphumet - Do 08.10.09 16:38
Das heißt folgendes
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| T1=class private public end; T2=class(T1) private public end; |
wenn ich in T2 eine Methode mit inherited aufrufe, wird die Methode von T1 aufgerufen.
elundril - Do 08.10.09 16:41
wenn du beide du in T2 die methode von T1 überschreibst glaub ich, dann ja.
lg elundril
mkinzler - Do 08.10.09 16:41
Ja. Du musst dich dann nur um die Erweiterungen deiner Klasse kümmern.
Critter - Do 08.10.09 16:42
Hi,
mit
inherited kannst du auf Funktionen aus der Vorfahrklasse zugreifen. Ein kleines Beispiel dazu:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
tKlasse1 = class(tObject) public procedure MachWas; virtual; end;
tKlasse2 = class(tKlasse1) public procedure MachWas; override; procedure MachDasAlte; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure tKlasse2.MachDasAlte; begin inherited MachWas; end;
procedure tKlasse2.MachWas; begin ShowMessage('Zwei'); end;
procedure tKlasse1.MachWas; begin ShowMessage('Eins'); end;
procedure TForm1.Button1Click(Sender: TObject); Var Klasse2 : tKlasse2; begin Klasse2 := tKlasse2.Create; Klasse2.MachWas; Klasse2.MachDasAlte; Klasse2.Free; end;
end. |
Interessant ist hier
MachDasAlte welche das
MachWas von
tKlasse1 und nicht von
tKlasse2 aufgerufen.
Du gibst also hinter
inherited den Namen der Funktion aus der Vohrfahrklasse an. Wenn die Methode in der Vorfahrklasse genau gleich heist und auch exakt die gleichen Parameter erwartet, kannst du den Methodennamen auch weg lassen.
critter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!