Nehmen wir an, wir schreiben ein System für Tests. Test enthält die Liste der Aufgaben und jede Aufgabe enthält die Frage und die Liste der Antworten. Auch wir nehmen an, dass Frage oder Antwort nicht nur der Text, sondern zum Beispiel Bild sein kann. Also verwenden wir Generika:
%Vor%Und das Problem tritt auf, wenn wir die Aufgabe erstellen:
%Vor% Wie schreibe ich TQuestion
als Untertyp von IQuestion
und TAnswer
- Untertyp von IAnswer
?
Ich habe versucht:
%Vor%Aber als ich erstellt habe:
%Vor%Das hat nicht funktioniert:
%Vor% Tatsächlich ist IQuestion<string>
nicht von IQuestion<object>
geerbt.
In Java würde ich Platzhalter in der Beschränkung von ITask
generischen Typen verwenden, in Kotlin hätte der obige Ansatz funktioniert.
Aber wie löst man es mit C #?
Sie benötigen einen dritten Parameter:
%Vor% Wie Sie wissen, ist IQuestion<string>
nicht von IQuestion<object>
geerbt, aber auf diese Weise können Sie TQuestion
be IQuestion<string>
haben.
Nachtrag: TQuestion
be IQuestion<object>
zu haben ist nur ein Problem, weil IQuestion
nicht Varianz definiert (also standardmäßig invariant). Wenn Sie so definieren, wie ich unten zeige, können Sie IQuestion<object>
verwenden (dasselbe gilt für IAnswer
).