dedlfix: Uebung Abstrakte Klassen mit abstrakten Parametern

Beitrag lesen

Hi!

Ein Generic Type ist in seinem Szenario ähnlich der Verwendung eines abstrakten Typs, nur dass eben alle Typen und nicht nur von Document abgeleitete verwendet werden können. [...]
Nein, da hast du etwas falsch verstanden und dementsprechend auch in allen Beispielen falsch angewandt.

Du hast nur ein Stichwort hingeworfen. Es gibt eine ganze Menge unterschiedliche Arten der Anwendungen von generischen Typen, so dass die Chance, zu verstehen wie du dir die Lösung vorgestellt hat, nicht zwangsläufig sehr hoch ist.

Nur die generische Klasse deklariert den generischen Typ, alle Implementation erweitern diese mittels konkreten Typings:

Ok, so kann man es machen und es sieht erst einmal gut aus. Das compiliert auch in der C#-Variante. Die Lösung hat jedoch die Eigenschaft, dass man immer Printer<mit_konkretem_Document_Type> als Typangabe verwenden muss. Beispielsweise geht nicht, Printer<Document> als Typ und dann einen LinePrinter oder Plotter zu übergeben. Lediglich einen LaserPrinter (der von Printer<Document> abgeleitet ist und damit alle Arten Dokumente drucken kann/können muss) kann man zuweisen. Aber es geht auch sowas (C#):

void foo<TDoc>(Printer<TDoc> p, TDoc doc) where TDoc: Document {
    p.print(doc);
  }

Java-Syntax düfte diese sein:

void foo<TDoc extends Document>(Printer<TDoc> p, TDoc doc) {
    p.print(doc);
  }

Damit kann man foo(linePrinter, textDocument) oder foo(plotter, drawing) oder foo(laserPrinter, textDocument) aufrufen, also spezialisierte Drucker mit einem konkretem DokumentTyp oder konkrete allgemeine Drucker mit beliebigen Dokumenten.

Diese Eigenschaft der Lösung bedingt also, dass zur Compile-Zeit bereits die konkret verwendeten Typen von Dokumenten und Drucker feststehen müssen.

Lo!