Autor Beitrag
pflo
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 31.10.10 22:14 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: 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,

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mo 01.11.10 09:00 
Als Lösung kannst du eigentlich nur Delegation verwenden:

ausblenden 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;

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)