Einzelnen Beitrag anzeigen

silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

[beantwortet] Best pratice: Klassen überspringen beim Vererben?

  Alt 14. Aug 2013, 16:09
Hallo zusammen,

erstens ist mir kein besserer Titel eingefallen...
zweitens muss ich warnen, dass ich vermutlich in der nächsten Zeit viele solcher Fragen stellen werde.

Worum es geht:
Ich habe ein Interface (oder eine abstrakte Klasse, kommt auf's gleiche raus). In der Klasse, die das Interface implementiert, soll aber nur ein Teil der Methoden verwendet werden und der Rest in der Ableitung der Implementierung. Wie geht man da am besten vor?

Gegeben sei das folgende Interface
Delphi-Quellcode:
type IMyInterface = interface(IInterface)
  function getName : string;
  function getType : THandlerType;
end;
Die Klasse SaveHandler implementiert das interface, benötigt aber nur die Methode getType. Die Methode getName macht hier noch keinen Sinn, weil es sich bei TSaveHandler um eine teilabstrakte Klasse handelt, die als Grundlage konkreter (TSaveTXT, TSaveCSV) Klassen dient. Erst in den konkreten Klassen muss/kann/darf/soll getName verwendet werden.

Delphi-Quellcode:
type TSaveHandler = class(TInterfacedObject, IMyInterface)
  protected
    procedure SaveFile; virtual; abstract;
  public
    function getType : THandlerType;
end;

type TSaveTXT = class(TSaveHandler)
  protected
    procedure SaveFile; override; //speichert als txt Datei
  public
    function getName : string; //Result := 'save as TXT'
end;

type TSaveCSV = class(TSaveHandler)
  protected
    procedure SaveFile; override; //speichert als csv Datei
  public
    function getName : string; //Result := 'save as CSV'
end;
Für mich ist es hier ein wenig "negativ", dass die Implementierung von getName die Klasse TSaveHandler überspringt.
Wenn ich also eine weitere Klasse TSaveXLS erzeugen wollte, müsste ich in allen "übergeordneten" Klassen/Interfaces nachsehen, was ich implementieren muss, es reicht also nicht, alle Methoden zu implementieren, die in TSaveHandler als abstract gekennzeichnet sind.

Wenn ich das vermeiden will, muss ich TSaveHandler "erweitern", so wie es im Folgenden dargestellt ist.


Delphi-Quellcode:
type TSaveHandler = class(TInterfacedObject, IMyInterface)
  protected
    procedure SaveFile; virtual; abstract;
    function getName2 : string; virtual; abstract;
  public
    function getType : THandlerType;
    function getName : string;
end;


procedure TSavehandler.getName : string;
begin
  Result := getName2;
end;
Somit reicht es aus, alle abstrakten Methoden der Basisklasse zu implementieren und man muss nicht in dessen Vorgängern herumsuchen, jedoch handelt man sich dadurch Schreibaufwand ein und umgeht vermutlich auch das DRY-Prinzip?
Wobei ich eben sagen muss, dass ich die zweite Variante übersichtlicher finde, weil eben die Basisklasse "komplett" ist.

Wie seht Ihr das, oder gibt es einen viel besseren Weg? In anderen Worten: Darf/kann man bei der Implementierung von Methoden eine oder mehrere Hierarchie-Ebenen überspringen oder ist das bad-practice?
Tobias
Bitte nicht hauen , ich weiß es nicht besser

Geändert von silver-moon-2000 (14. Aug 2013 um 18:37 Uhr)
  Mit Zitat antworten Zitat