AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign [beantwortet] Best pratice: Klassen überspringen beim Vererben?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von silver-moon-2000 · begonnen am 14. Aug 2013 · letzter Beitrag vom 14. Aug 2013
 
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, 15: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 17:37 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz