使用带有通用接口或类的约束

时间:2017-02-23 07:55:17

标签: c# .net

假设我们编写了一个测试系统。测试包含任务列表,每个任务包含问题和答案列表。我们还假设问题或答案不仅可以是文本,还可以是图像。所以我们使用泛型:

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应该是IQuestionTAnswer的子类型 - 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#解决它?

1 个答案:

答案 0 :(得分:4)

在我理解问题的方式中,您可以通过在ITask中引入其他类型参数来制定约束,如下所示,省略之前使用的类型参数TQuestionTAnswer

interface ITask<T> 
{
    IQuestion<T> Question { get; }
    List<IAnswer<T>> Answers { get; }
}