假设我们编写了一个测试系统。测试包含任务列表,每个任务包含问题和答案列表。我们还假设问题或答案不仅可以是文本,还可以是图像。所以我们使用泛型:
public interface IQuestion<T>
{
T Content { get; }
}
public interface IAnswer<T>
{
T Content { get; }
bool IsCorrect { get; }
}
当我们创建任务时会出现问题:
interface ITask<TQuestion, TAnswer>
{
TQuestion Question { get; }
List<TAnswer> Answers { get; }
}
如何写TQuestion
应该是IQuestion
和TAnswer
的子类型 - IAnswer
的子类型?
我试过了:
interface ITask<TQuestion, TAnswer>
where TQuestion : IQuestion<object>
where TAnswer : IAnswer<object>
但是当我创建时:
class TextQuestion : IQuestion<string> {...}
class TextAnswer : IAnswer<string> {...}
这不起作用:
class TextTask : ITask<TextQuestion, TextAnswer>
事实上,事实上,IQuestion<string>
并未继承IQuestion<object>
。
在 Java 中,我会使用通配符来限制ITask
泛型类型,在 Kotlin 中,上述方法可行。
但如何使用C#解决它?
答案 0 :(得分:4)
在我理解问题的方式中,您可以通过在ITask
中引入其他类型参数来制定约束,如下所示,省略之前使用的类型参数TQuestion
和TAnswer
。
interface ITask<T>
{
IQuestion<T> Question { get; }
List<IAnswer<T>> Answers { get; }
}