以下列方式定义了一个类。
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
和其他人......但我仍然无法正确理解语法。这有什么不对?
答案 0 :(得分:4)
抽象类的约束需要where T : class, IMvxViewModel
才能匹配基数。例如:
abstract class BaseViewController1<T> : MvxViewController<T> where T : class, IMvxViewModel
答案 1 :(得分:2)
因为您已将MvxViewController
的泛型参数约束到class
和IMvxViewModel
,所以您还必须将这些相同的约束扩展到抽象类的泛型参数。
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
参数是否满足其约束条件。