我有以下类/接口:
public abstract class AbstractBasePresenter<T> : IPresenter<T>
where T : class, IView
{
}
public interface IPresenter<T>
{
}
public interface IView<TV, TE, TP> : IView
where TV : IViewModel
where TE : IEditModel
//where TP : AbstractBasePresenter<???>
{
}
public interface IView {}
有什么办法可以在IView上限制TP&lt;&gt;是一个继承自AbstractBasePresenter的类?
或者是我唯一可以选择创建非通用IPresenter接口,然后更新IPresenter来实现它,然后使用“TP:IPresenter”检查?
由于
更新
以下建议的答案不起作用:
public interface IView<TV, TE, TP> : IView
where TV : IViewModel
where TE : IEditModel
where TP : AbstractBasePresenter<IView<TV,TE,TP>>
{
}
我将接口声明为:
public interface IInsuredDetailsView : IView<InsuredDetailsViewModel, InsuredDetailsEditModel, IInsuredDetailsPresenter>
{ }
public interface IInsuredDetailsPresenter : IPresenter<IInsuredDetailsView>
{ }
编译器抱怨IInsuredDetailsPresenter不能分配给AbstractBasePresenter&gt;
答案 0 :(得分:4)
没问题,不需要另一个通用参数:
public interface IView<TV, TE, TP> : IView
where TV : IViewModel
where TE : IEditModel
where TP : AbstractBasePresenter<IView<TV,TE,TP>>
{
}
编辑:更新了问题:
如果您不需要演示者从AbstractBasePresenter继承,请将代码更改为:
public interface IView<TV, TE, TP> : IView
where TV : IViewModel
where TE : IEditModel
where TP : IPresenter<IView<TV,TE,TP>>
{
}
答案 1 :(得分:2)
你可以这样做,但是你需要为IView<>
接口提供一个更多的类型参数:
public interface IView<TV, TE, TP, T> : IView
where TV : IViewModel
where TE : IEditModel
where TP : AbstractBasePresenter<T>
where T : class, IView
{
}
修改强>
根据您问题中的版本:IInsuredDetailsPresenter
绝对无法转让给AbstractBasePresenter
。由于您在原始问题中要求的约束,编译器正在抱怨。更具体地说,由于这部分
where TP : AbstractBasePresenter<T>
似乎你想要将TP
限制为一个接口。您可以尝试以下代码:
public interface IView<TV, TE, TP, T> : IView
where TV : IViewModel
where TE : IEditModel
where TP : IPresenter<T>
{
}
不再需要T
上的约束,因为IPresenter<T>
没有。当然,你可以用类似的方式调整armen.shimoon的答案。关键是用AbstractBasePresenter<T>
约束替换IPresenter<T>
约束。