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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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}

{ tKlasse2 }

procedure tKlasse2.MachDasAlte;
begin
  inherited MachWas;
end;

procedure tKlasse2.MachWas;
begin
  ShowMessage('Zwei');
end;

{ tKlasse1 }

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