Hallo!
Folgendes Problem:
Es sollen MP3 und JPG Dateien verwaltet werden. Hierfür gibt es die allgemeine Oberklasse File mit den spezifischen Unterklassen MP3File und JPGFile sowie die abstrakte Klasse DateiVerwalter mit den Unterklassen MP3Vewalter und JPGVerwalter.
Die Klasse DateiVerwalter macht die verwalteten Dateien als Dictionary<string, File> zugänglich:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| public class DateiVerwalter { public abstract Dictionary<string, File> Files { get; } } |
In den Unterklassen MP3Vewalter und JPGVerwalter wird sehr viel mit den spezifischen Eigenschaften von MP3File bzw. JPGFile gearbeitet. Würde daher Dictionary<string, File> files direkt in der Oberklasse DateiVerwalter definiert, wären in MP3Vewalter sehr viele Casts von File in MP3File notwendig (analog von File in JPGFile in JPGVerwalter). Daher definiere ich das Dictionary erst in den Unterlassen mit den korrekten Typen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| public class MP3Verwalter : DateiVerwalter{ protected Dictionary<string, MP3File> mp3Files; public override Dictionary<string, File> Files { get { return mp3Files; } get { return (mp3Files as override Dictionary<string, File>); } } }
public class JPGVerwalter : DateiVerwalter{ protected Dictionary<string, JPGFile> jpgFiles; public override Dictionary<string, File> Files { get { return jpgFiles; } get { return (jpgFiles as override Dictionary<string, File>); } } } |
Diese Casts funktionieren nicht, obwohl MP3File und JPGFile Unterklassen von File sind. Wie löst man das richtig?
Die Lösung die Dictionaries in den Unterklassen zu erstellen ist eigentlich auch nicht. Zwar hat dies wie gesagt den Vorteil, dass nicht dauernd gecasted werden muss, dafür hat man natürlich doppelt Arbeit. Im konkreten Projekt gibt es noch wesentlich mehr Dateiformate, und entsprechend mehr Unterklassen. Wie sieht also eine richtig saubere Lösung hierfür aus?
Besten Dank
Ares