我有以下类/接口:
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 {}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以限制TP在IView <>上的TP是一个继承自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>>
{
}
Run Code Online (Sandbox Code Playgroud)
我将接口声明为:
public interface IInsuredDetailsView : IView<InsuredDetailsViewModel, InsuredDetailsEditModel, IInsuredDetailsPresenter>
{ }
public interface IInsuredDetailsPresenter : IPresenter<IInsuredDetailsView>
{ }
Run Code Online (Sandbox Code Playgroud)
编译器抱怨IInsuredDetailsPresenter不能分配给AbstractBasePresenter>
您可以做到这一点,但您需要向IView<>接口提供另一种类型参数:
public interface IView<TV, TE, TP, T> : IView
where TV : IViewModel
where TE : IEditModel
where TP : AbstractBasePresenter<T>
where T : class, IView
{
}
Run Code Online (Sandbox Code Playgroud)
编辑:
根据您问题中的版本:IInsuredDetailsPresenter绝对不能分配给AbstractBasePresenter. 由于您在原始问题中请求的限制,编译器正在抱怨。更具体地说,由于这一部分
where TP : AbstractBasePresenter<T>
Run Code Online (Sandbox Code Playgroud)
看来你TP也想限制为一个接口。您可以尝试下面的代码:
public interface IView<TV, TE, TP, T> : IView
where TV : IViewModel
where TE : IEditModel
where TP : IPresenter<T>
{
}
Run Code Online (Sandbox Code Playgroud)
T不再需要对 的约束,因为IPresenter<T>没有。当然,您可以以类似的方式调整armen.shimoon的答案。重点是用约束代替AbstractBasePresenter<T>约束IPresenter<T>。
| 归档时间: |
|
| 查看次数: |
1488 次 |
| 最近记录: |