2017-07-15 20 views
-1

私は2つのインターフェースを持っています。それらの1つは「プレゼンター」クラス(MVPパターン)を表します。それはIPresenterと呼ばれています。 もう1つのインタフェースは、具体的なPresenterクラスが返すことができるオブジェクトの1つを表します。それはIPresenterElementと呼ばれています。 キャスティングリスト<Class>リストへ<Interface>

BindingList<People> SourceList { get { return peopleList; } } 

コンパイラはエラーを発生させますが、次のように私は(IPresenterElementをimplementd)Peopleクラスのオブジェクトを管理し、具体的なPresenterクラスにそのプロパティを記述するときに、このIPresenterインタフェースは、プロパティ

BindingList<IPresenterElement> SourceList { get; } 

を宣言しかし、具体的なクラスがインタフェースプロパティを実装していないことを伝えます。言い換えれば、人々がIPresenterElementであることに注意することはできません。

どのようにこの状況を克服できますか?

+0

は、人々の実装クラス – frozen

+0

マークを表示します角括弧は 'code'であり、それらは食べられません..! – TaW

+0

C#は、インターフェイスおよびデリゲートのみをサポートしますが、クラスはサポートしません。したがって、 'BindingList 'は 'People'と' IPresenterElement'の関係にかかわらず決して 'BindingList 'にはなりません。 – PetSerAl

答えて

1

インターフェイスを正確に実装する必要があります。戻り値の型を変更することはできません。あなたは

public interface IPresenter<T> where T: IPresenterElement 
{ 
    BindingList<T> SourceList { get; } 
} 

ジェネリックあなたのインターフェースを作り、あなたはインターフェイス

public class PeoplePresenter : IPresenter<People> 
{ 
    public BindingList<People> SourceList { get; } 
} 
1

を実装するときに、具体的なタイプを指定することができますしかし、簡単な解決策は、一般的なIPresenterインターフェース作るために次のようになります。

public interface IPresenter<TPresenterElement> where TPresenterElement : IPresenterElement 
{ 
    BindingList<TPresenterElement> SourceList { get; } 

    // ... 
} 

public class PeoplePresenter : IPresenter<People> 
{ 
    public BindingList<People> SourceList { get; } 

    // ... 
} 

これは本当に役立つかどうかです。あなたは、一般的な非さIPresenterインタフェースを必要とするだろう場合は、決してただ、すべての具体的な実装上のBindingList<IPresenterElement>性を有すると実際のデータとの同期を扱う以外がある(例えばList<People>

+0

@ZdenëkJelinekありがとうございました。私はあなたのアプローチを試してみます – marcelo

+0

@ZdenëkJelinekそれは魅力のように働いた。ありがとうございました。 – marcelo

関連する問題