![]() |
Vererbung von Methoden verhindern
Hi, ich habe ein Problem. Ich habe in meiner Basisklasse T2DXSprite zwei Methoden "Load" mit overload deklariert.
Jetzt brauche ich in der abgeleiteten Klasse T2DXAnimatedSprite auch genau zwei Methoden "Load", allerdings mir anderen Parametern. Ich möchte also verhindern, dass die alten Load Methoden angezeigt werden und möchte nur die neuen haben. Wie kann ich das erreichen? Grüße |
Re: Vererbung von Methoden verhindern
Indem du die Sichtbarkeit verringerst
|
Re: Vererbung von Methoden verhindern
Sollte man aber nicht machen. Verstecken von Methoden ist im OOP nich drin, da eine speziellere Klasse immer auch die Methoden der allgemeineren Klasse haben soll.
|
Re: Vererbung von Methoden verhindern
sichtbarkeit verringern geht nicht da durch einen cast auf die vorgängerklasse wieder alle Methoden zur Verfügung stehen.
|
Re: Vererbung von Methoden verhindern
Ja aber was soll ich denn dann machen? Die Load Methoden der alten Klassen sind ohne die neuen Parameter in der neuen Klasse sinnlos und können unter Umständen auch zu Fehlern führen, wenn sie statt den neuen Load-Methoden aufgerufen werden!? :gruebel: :wall:
|
Re: Vererbung von Methoden verhindern
Dann stimmt was an Deinem Klassendesign nicht.
Sauberste Idee: Du überdenkst Dein Klassendesign und sorgst dafür, dass das Verwenden einer Klasse auch dann noch funktioniert, wenn Du eine Ableitung dieser Klasse verwendest. Wenn man sich mal OOP zu herzen nimmt, dann muss man immer eine Ableitung der Klasse genauso benutzen können wie die Basisklasse, ohne das es zu Fehlern kommt. Alternative (aber deutlichst schlechtere) Lösung: Du überschreibst die beiden alten Methoden und anstelle was zu machen wirfst Du ne Exception. |
Re: Vererbung von Methoden verhindern
eine andere Variante wäre noch die alten Methoden zu überschreiben und daraus die neuen Methoden mit Standardparamtern aufrufen.
|
Re: Vererbung von Methoden verhindern
Vielleicht wäre es dan besser, T2DXAnimatedSprite nicht von T2DXSprite abzuleiten, sondern beide einer abstrakte Basisklasse abzuleiten, in der bereits alle Methode und Eigenschaften deklariert werden, die die beiden abgeleiteten Klassen gemeinsam haben.
MfG, Bug |
Re: Vererbung von Methoden verhindern
Hm, ok ich überdenke das nochmal ;-)
Danke |
Re: Vererbung von Methoden verhindern
Also wenn ich folgendes deklariere:
Delphi-Quellcode:
dann erhält man Folgendes Verhalten:
TSprite = class
public procedure Load; overload; procedure Load(i : integer) ; overload; end; TSprite2 = class(TSprite) public procedure Load(i, j : integer) ; end;
Delphi-Quellcode:
bzw.
procedure TForm2.cmd1Click(Sender: TObject);
var sprite : TSprite2; begin sprite := TSprite2.Create; sprite.Load(1, 2) ; // Es steht nur die Load Methode aus TSprite2 zur Verfüung end;
Delphi-Quellcode:
Also was stört dich an diesem Verhalten...
procedure TForm2.cmd1Click(Sender: TObject);
var sprite : TSprite; begin sprite := TSprite2.Create; sprite.Load(1) ; // Es stehen die Load Methode aus TSprite zur Verfüung end; Wenn du unbedingt willst, dass die Load Methode NUR DANN auch ausgeführt werden, wenn du direkt eine Instanz über TSprite.Create erstellst, dann kannst du das höchstens zur Laufzeit in der Load Methode selbst prüfen, z.B. so:
Delphi-Quellcode:
Aber schön ist das nicht, weil es, wie es von Jens und Sebastian bereits angedeutet wurde, nicht im Sinne der Objektorientierung ist.
procedure TSprite.Load;
begin if (Self.ClassNameIs('TSprite')) then begin showmessage('No param') ; end; end; procedure TSprite.Load(i: integer); begin if (Self.ClassNameIs('TSprite')) then begin showmessage(inttostr(i)) ; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz