Einzelnen Beitrag anzeigen

Captain Albern

Registriert seit: 15. Feb 2019
11 Beiträge
 
#1

Frage zur Vererbung von Methoden

  Alt 15. Feb 2019, 08:00
Guten Tag,

erstmal vorab: Mein Code funktioniert schon (nicht der Code unten, das ist ein verkürztes Beispiel), er scheint mir aber unnötig aufwändig zu sein. Ich denke, es gäbe eine einfachere Lösung, wenn ich mich besser auskennen würde. Kennt sich jemand besser aus ?

Ich verwende eine Klasse "TProjekt", die ein Array von Objekten "TProtoBlock" enthält. Von diesem TProtoBlock ist eine Reihe von anderen Klassen abgeleitet z.B. TBitmapBlock. Es soll diverse Methoden geben, z.B. Draw, die jede Kind-Klasse hat, die also in TProtoBlock vordefiniert sind, allerdings in jeder Kind-Klasse anders implementiert und daher überschrieben werden. Jetzt hätte ich es gerne so, dass man von außen einen beliebigen Block als TProtoBlock, ohne zu beachten, welcher Subtyp es konkret ist, nimmt und die Draw-Methode aufruft (siehe unten Beispiel-Prozedur). Dann wird allerdings nicht die Draw-Methode der Kind-Klasse aufgerufen, sondern die Draw-Methode von TProtoBlock. Diese kann dann die Draw-Methode der Kind-Klasse aufrufen (siehe Beispiel unten). Das ist aber aufwändig, weil ich diese Typprüfung und Auswahl dann in jeder Methode für jede Art von Unterklasse wieder neu so schreiben müsste. Geht es irgendwie automatisch, dass man sagt, die Draw-Methode der Basisklasse soll versteckt sein und es sollen direkt die Methoden Kinder-Klassen aufgerufen werden ?
Man könnte natürlich den Typ auch in der aufrufenden Funktion prüfen und dann (Block as TBitmapBlock).Draw aufrufen, aber das würde den Aufwand nur von innen nach außen verschieben. Ich hoffe, das war nicht zu verworren. Das Beispiel sollte Klarheit schaffen. Vielen Dank im Voraus !

Delphi-Quellcode:
type
  TProtoBlock = class
    procedure Draw;
  end;
  TBitmapBlock = class(TProtoBlock)
    procedure Draw;
  end;
  //..... weitere Unterarten von class(TProtoBlock)
  //.....
  TProject = class
    Blocks : Array of TProtoBlock;
  end;

var
  Project:TProject;

procedure Beispiel;
begin
  Project.Blocks[x]:=TBitmapBlock.Create;
  Project.Blocks[x].Draw;
end;

procedure TProtoBlock.Draw;
begin
  if Self is TBitmapBlock then (Self as TBitmapBlock).Draw;
  if Self is .....andere Arten
  if Self is .....andere Arten
  if Self is .....andere Arten
end;
  Mit Zitat antworten Zitat