0

次の仕様を持つパラメーターp1のコンストラクターがあります。

  • p1はUserControlから継承する必要があります
  • p1はインターフェイスMyInterfaceを実現する必要があります

例:

public class ClassA: UserControl, MyInterface
{ ... }

誰でも私がメソッドを定義する方法を考えています。

コンストラクターは次のようになります。

public MyClass(UserControl uc) : base(uc)
{ 
   // access to MyInterface-Methods
}

基本クラス(サードパーティのdllからのもの)にはUserControlが必要です。MyInterfaceメソッドにアクセスする必要があります。

よろしくお願いします、rhe1980

4

2 に答える 2

2

私のコメントの後、私の頭に浮かぶのはただ

public void MyMethod<T>(T param) where T : UserControl, MyInterface
{
     // do something here
}

[編集]OK、その間誰もそれを刺していないので、私はフォローしようとします。ある種の基本クラスから派生したクラスがあるようですUserControl。試すことができるものは次のとおりです。

public interface ITest
{
    void AwesomeInterface();
}

//As far as I could tell, this class is in some 3rd party DLL
public class TheBaseClass
{
    protected TheBaseClass(UserControl uc)
    {

    }
}

//Now this should work just fine
public class ClassB<T> : TheBaseClass where T : UserControl, ITest
{
    public ClassB(T param) : base(param)
    {
        param.AwesomeInterface();
    }
}
于 2012-06-04T11:35:20.980 に答える
0

これを行うには、抽象基本クラスを宣言します。

public abstract class BaseControl : UserControl, IMyInterface {}

そして、そのタイプのコンストラクター引数を宣言します。クライアントコードは、BaseControlから派生し、インターフェイスを実装する必要があります。

これがWPFデザイナーでうまく機能するかどうかはわかりませんが、Winformsデザイナーでは機能しないことはわかっています。基本クラスのインスタンスを構築できる必要があります。同じ理由で、一般的な作業も行いません。この場合、ランタイムチェックに頼る必要があります。

public MyClass(UserControl uc) : base(uc)
{ 
    if (uc as IMyInterface == null) {
        throw new ArgumentException("You must implement IMyInterface", "uc");
    }
    // etc..
}
于 2012-06-04T12:35:46.683 に答える