0

インターフェイス IDataControl があります。

public interface IDataControl
{
    ...
}

次に、List<IDataControl> の変数を持つクラスがあります。

List<IDataControl> items;


問題は、このコレクションの要素を別のフォームまたは別のコントロールの「コントロール」プロパティに追加しようとしたときです。

panel.Controls.Add(items[i]);

「IDataControl」は「Control」から継承されていないため、IDE は「最適なオーバーロードされたメソッド マッチング……」と言っています。

私はエラーを理解しており、次のようなキャストを実行できることを知っています。

panel.Controls.Add(   (Control)items[i]   );


しかし、キャストを必要とせず、厳密な型検証も行う「よりクリーンな」方法があるかどうかを知りたいです。



では、「IDataControl」は Control 派生オブジェクトによってのみ実装できることを示すことは可能ですか?

public interface IDataControl where this : Control
{
    ...
}


または、クラスとインターフェイスの変数を宣言することはできますか?
このようなもの:

Control:IDataControl item;
List<Control:IDataControl> items;




ありがとう

4

1 に答える 1

0

すでに理解しているように、 System.Windows.Forms.Control はインターフェイスについて何も知りません。


public interface IDataControl where this : Control
{
    ...
}

そんなことはできません。ジェネリック型制約に適用されます 。また、インターフェイスはクラスから継承できません。インターフェイスには次のプロパティがあります。

  • インターフェイスは抽象基本クラスのようなものです。インターフェイスを実装する非抽象型は、そのすべてのメンバーを実装する必要があります。

  • インターフェイスを直接インスタンス化することはできません。

  • インターフェイスには、イベント、インデクサー、メソッド、およびプロパティを含めることができます。

  • インターフェイスには、メソッドの実装は含まれていません。

  • クラスと構造体は、複数のインターフェイスを実装できます。

  • インターフェイス自体は、複数のインターフェイスから継承できます。

必要なのはおそらく次のことです。コントロールを作成するときは、インターフェイスから継承します。

このホスト コントロールでは、メソッドを作成する必要があります

private void AddDataControl(IDataControl dataControl)
{
   if(IDataControl is Control){
      //your logic
   }
   else{
      throw new ArgumentException();
   }
}

あくまでも一般的な方法です。コードによって異なります。

于 2012-08-17T10:22:07.717 に答える