11

我有以下类/接口:

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 限制为从 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>

4

2 回答 2

4

没问题,不需要另一个泛型参数:

public interface IView<TV, TE, TP> : IView
    where TV : IViewModel
    where TE : IEditModel
    where TP : AbstractBasePresenter<IView<TV,TE,TP>>
{
}

编辑:更新的问题:

如果不需要 Presenter 从 AbstractBasePresenter 继承,请将代码更改为:

public interface IView<TV, TE, TP> : IView
    where TV : IViewModel
    where TE : IEditModel
    where TP : IPresenter<IView<TV,TE,TP>>
{
}
于 2012-09-07T08:00:01.937 回答
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>

于 2012-09-07T07:58:57.110 回答