Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Klasse mit zwei parentklassen definieren


pflo - So 31.10.10 22:14
Titel: Klasse mit zwei parentklassen definieren
hi Leute,

ich hab - kurz gefasst - folgende Situation:

TObject00 = class(TObject)
. procedure abc; virtual;
. procedure def; virtual;
end;

TObject10 = class(TOject00)
. procedure abc; override;
end;

TObject01 = class(TObject00)
. procedure def; override;
end;

So weit. TObject10_01 soll jetzt die procedure abc von TObject10 haben und die procedure def von TObject01.
Ich habe alle Schreibweisen ausprobiert, die mir eingefallen sind.

hat jemand eine Idee?

Danke schon mal in Vorraus, schon alleine dafür, dass du meine Frage durchgelesen hast.


jaenicke - So 31.10.10 22:18

Mehrfachvererbung gibt es in Delphi nicht. Du kannst also nicht von zwei Klassen erben.

Die einzige Möglichkeit ist, die Vererbungshierarchie so hinzubekommen, dass du keine Mehrfachvererbung brauchst. In diesem Zusammenhang sind auch Interfaces oft nützlich.


der organist - Mo 01.11.10 00:24

wenn, das Objekt 10 die abc verändert und 01 die def verändert und beide jeweils die vom andern annehmen, was haben die beiden jeweils für Prozeduren? Sind das nicht dann die gleichen, sprich 10 und 01 haben jeweils abc und def, beide die override Versionen?
Vllt vertuhe ich mich ja auch einfach..
Gruss,


jaenicke - Mo 01.11.10 07:04

Nein, da hast du was falsch verstanden bei der Vererbung.

Wenn ich im Beispiel ein Objekt vom Typ TObject00 erstelle, habe ich die beiden unveränderten Methoden.
Wenn ich ein Objekt vom Typ TObject10 erstelle, habe ich die veränderte Methode abc und die originale def.
Wenn ich ein Objekt vom Typ TObject01 erstelle, habe ich die originale Methode abc und die veränderte def.

Erwünscht wäre jetzt hier ein Objekt, das beide veränderten Methoden enthält. Also sowohl von TObject10 als auch von TObject01 abgeleitet ist. Wenn es denn gehen würde also sowas:

Delphi-Quelltext
1:
TObject11 = class(TObject01, TObject10)                    
Diese Schreibweise funktioniert in Delphi zwar, aber es darf dabei nur eine Klasse vorkommen, der Rest können nur ein oder mehrere Interfaces sein. (Dass das überhaupt geht, war zur Unterstützung von COM notwendig.)


Xion - Mo 01.11.10 09:00

Als Lösung kannst du eigentlich nur Delegation verwenden:


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:
type TObject00 = class(TObject)
  procedure abc; virtual;
  procedure def; virtual;
end;

type TObject10 = class(TOject00)
  procedure abc; override;
end;

type TObject01 = class(TObject00)
  procedure def; override;
end

type TObject10_01 = class(TObject10)
  private
    obj01: Tobject01;
  public
    procedure def; override;
end;

procedure TObject10_01.def;
begin
  if obj01=nil then
    obj01:=TObject01.Create;   //<< das hier würde man eher in den constructor packen
  obj01.def;
end;