如何创建从泛型类扩展的抽象类

时间:2018-06-07 14:22:46

标签: c#

以下列方式定义了一个类。

class MvxViewController<TViewModel> where TViewModel : class, IMvxViewModel

我通过简单地扩展来使用这个类,例如:

class MyController : MvxViewController<MyViewModel>

由于我在每个控制器中都有重复的任务,我想创建一个从MvxViewController扩展的抽象类,而后者又由我的每个控制器(如果需要)扩展。但是,我无法创建这个抽象类,因为语法总是错误的。到目前为止我尝试过的一些事情:

a) abstract class BaseViewController<T> : MvxViewController<T>
b) abstract class BaseViewController<T> where T : MvxViewController<T>
c) abstract class BaseViewController<T> : MvxViewController<T> where T : class

和其他人......但我仍然无法正确理解语法。这有什么不对?

3 个答案:

答案 0 :(得分:4)

抽象类的约束需要where T : class, IMvxViewModel才能匹配基数。例如:

abstract class BaseViewController1<T> : MvxViewController<T> where T : class, IMvxViewModel

答案 1 :(得分:2)

因为您已将MvxViewController的泛型参数约束到classIMvxViewModel,所以您还必须将这些相同的约束扩展到抽象类的泛型参数。

abstract class BaseViewController<T> : MvxViewController<T> where T : class, IMvxViewModel

约束不是继承的,必须明确键入。

答案 2 :(得分:2)

您需要将MvxViewController<TViewModel> TViewModel上的约束放在派生类的类型参数上,如下所示:

abstract class BaseViewController<T> : MvxViewController<T> where T : class, IMvxViewModel {
    ...
}

这是必需的,因为当您从中派生另一个类时,C#编译器必须检查TViewModel参数是否满足其约束条件。