Einzelnen Beitrag anzeigen

hanvas

Registriert seit: 28. Okt 2010
166 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Methoden in abgeleiteten Klassen ggf. einschränken

  Alt 11. Jul 2024, 22:59
Das Problem dabei wäre, dass ich dann (abgesehen von TGenericTagItem) keinen sinnvollen gemeinsamen Vorfahren für die TagItems in den jeweiligen MetaDaten-Formaten nutzen kann. Denn die Unterscheidung Text/Bild/ExtendendText/Binary/... gibt es jeweils für ID3v2Items, Apev2Items, VorbisCommentItems, ...

Dann müsste ich wieder im eigentlichen Programmcode für jedes Format anders casten bzw. den Typ checken, um "GetText" aufrufen zu können. Und genau davon möchte ich ja weg.
Warum machst Du das Verhalten nicht einfach konfigurierbar und überlässt die Wahl (nichts machen, den "Fehler" loggen, eine Exception auslösen, den "Fehler" in einer Variablen speichern und mittels einer Methode wie getLastErrorCode auslesen usw.) nicht einfach den Benutzer deiner Lib.

Aber abgesehen davon. Wenn ich Dein Problem richtig verstehe dann hast Du nach:

Delphi-Quellcode:
aAudioFile := AudioFileFactory.CreateAudioFile(aFileName);
aAudioFile.ReadFromFile(aFileName);
aAudioFile.Title := EditTitle.Text;
aAudioFile.UpdateFile;
doch alle Informationen die Du brauchst. Kanst Du nicht beispielsweise AudioFileFactory um eine Methode erweitern die zu jedem Tag die richtige Klasse (oder alternativ Interface) registriert, und nutzt diese Informationen in der Methode GetAllTagItems um die richtigen Klassen zu instanzieren.

Delphi-Quellcode:

type TGenericIDTag = class ...

     TTagClass = class of TGenericIDTag;

     TTextIDTag = class( TGenericIDTag )
     end;

     TImageIDTag = class(TGenericIDTag)
     end;

     TAudioFile = class()
     private
       FFactory : TAudioFileFactory
     public
       procedure GetAllTagItems(destList: TTagItemList);
     end;

     TAudioFileFactory = class()
     public
       function CreateAudioFile(const aFileName : String) : TAudioFile;
       procedure RegisterTag(const aIdentifier : String; aTag : TTagClass);
     end;
dann hättest Du alle Informationen um beim Aufruf von GetAllTagItems eine Liste mit den "richtigen" Objekten zu konstruieren.

Delphi-Quellcode:
 TagList := TTagItemList.Create;
 try
   aAudioFile.GetAllTagItems(TagList);
   for var tag : TGenericIDTag in TagList do
    begin
     if tag is TTextIDTag then
      begin
        ....
      end;
    end;
 finally
 end;
Ich hofffe ich habe mich verständlich ausgedrückt.

hth Ha Jö
  Mit Zitat antworten Zitat