Verwendung von Einschränkungen mit generischer Schnittstelle oder Klasse

8

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 #?

    
Letfar 23.02.2017, 07:55
quelle

2 Antworten

4

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 ).

%Vor%     
Theraot 23.02.2017, 08:02
quelle
4

In der Art, wie ich die Frage verstehe, können Sie die Einschränkung formulieren, indem Sie einen zusätzlichen Typparameter in ITask einfügen, indem Sie die zuvor verwendeten Typparameter TQuestion und TAnswer weglassen.

%Vor%     
Codor 23.02.2017 08:00
quelle

Tags und Links