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>>
{
}

編集:更新された質問:

プレゼンターが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<>それは可能ですが、インターフェースにもう1つの型引数を指定する必要があります。

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 に答える