思いついたインターフェイスのキャストに頭を悩ませています。これは、C#Windowsフォーム用のMVPデザインです。フォームクラスに実装するIViewクラスがあります。私がさまざまな特定のプレゼンターに導き出したIPresenterもあります。各プレゼンターは、役割に応じてIViewを異なる方法で管理します。たとえば、フォームにデータをプリロードするEditPresenterで既存のデータを編集するのではなく、ダイアログを開いてAddPresenterで新しいデータセットを入力します。これらはそれぞれIPresenterから継承します。コードをそのまま使用したい:
AddPresenter<ConcreteView> pres = new AddPresenter<ConcreteView>();
私は基本的にこれを機能させていますが、これらのプレゼンターとそれらが管理するビューは、実行後にロードされるプラグインにバンドルされています。つまり、プラグインインターフェイスとして機能するManagerクラスが「mode」パラメーターを取る必要があります。このモードパラメータは、プレゼンターの追加または編集を作成するファクトリメソッドに使用されますが、ダイアログを表示するための呼び出しは後で行われるため、次のようにIPresenterインターフェイスを介して呼び出す必要があります。
private IPresenter<IView> pres;
public ShowTheForm()
{
pres.ShowDialog();
}
AddPresenterの具体的なインスタンス化を「pres」メンバーにケーシングすることになると、問題が発生します。これが私が持っているものの簡略化されたバージョンです:
interface IView
{
void ViewBlah();
}
interface IPresenter<V> where V : IView
{
void PresBlah();
}
class CView : IView
{
public void ViewBlah()
{
}
}
class CPresenter<T> : IPresenter<T> where T : IView
{
public void PresBlah()
{
}
}
private void button3_Click(object sender, EventArgs e)
{
CPresenter<CView> cpres = new CPresenter<CView>();
IPresenter<IView> ipres = (IPresenter<IView>)cpres;
}
これはエラーです:
Unable to cast object of type 'CPresenter`1[MvpApp1.MainForm+CView]' to type 'IPresenter`1[MvpApp1.MainForm+IView]'.
私が言えることから、PresenterとGenericの両方の型の仕様は、インターフェイスのサブクラスであるため、キャストされない理由がわかりません。
何かご意見は?
スティーブ