2

クラスのメンバーを Control にする必要があり、定義したインターフェイスを実装する必要があります。

このように宣言すると...

public class MyClass
{
    public Control MyMember;
}

...その後、インターフェイスメソッドを取得しませんが、このように宣言すると...

public class MyClass
{
    public IMyInterface MyMember;
}

...次に、Control メソッドを取得できません。MyMember を両方から継承する型に初期化する必要があることを指定する方法はありますか? MSDN で見つかりません。何かのようなもの...

public class MyClass
{
    public Control : IMyInterface MyMember;
}

... また ...

public class MyClass
{
    public Control MyMember : IMyInterface;
}

...ただし、どちらも機能しません。メンバーを宣言するときにインターフェイスを指定できますか? その場合、どのように指定できますか?

4

6 に答える 6

2

ジェネリックを制約付きで使用できます。

public interface MyClass {
    public T GetMyControl() where T : Control, IMyInterface { /* ........ */ }
}
于 2008-11-13T09:13:36.827 に答える
1

Control と単純なジェネリック クラスの周りにラッパー クラスを記述するのは非常に面倒なので、次のようにします。

public class MyGenericClass<T> where T : Control, IMyInterface
{
    public T t;
}

あなたのニーズに合わないかもしれません。さまざまなプロパティを使用して、フィールドに別の方法でアクセスできます。

public class MyClass
{
    private IMyInterface m_field;
    public Control FieldAsControl
    {
        get { return m_field as Control; }
    }
    public IMyInterface Field
    {
        get { return m_field; }
        set
        {
            if (m_field is Control)
            {
                m_field = value;
            }
            else
            {
                throw new ArgumentException();
            }
        }
    }
}
于 2008-11-13T15:57:37.690 に答える
0

T を返す関数「Self」を含むインターフェイス ISelf(of out T) [*] を宣言します。 インターフェイスで非ジェネリック バージョンとジェネリック バージョンをサポートし、ジェネリック バージョンは非ジェネリック バージョンと ISelf(of自体)。次に、ISelf(of Control) と ISelf(of IMyInterface) の両方からクラスを継承させ、フィールド MyMember を ISelf (of IMyInterface(of Control)) 型に宣言します。次に、MyMember を iMyInterface として使用し、MyMember.Self をコントロールとして使用できます。この方法で任意の数のインターフェイスを組み合わせることができます。

[*] 山かっこが HTML タグとして処理されるのを避けるために使用されるジェネリックの VB 構文。

于 2011-01-06T17:15:44.947 に答える
0

次のように定義されたインターフェイスを使用して、コントロールから派生した独自のクラスを作成できます。

class MyControl : Control, IMyInterface
{
}

次に、このクラスをメンバーとして使用します。

public class MyClass
{
    public MyControl MyMember;
}
于 2008-11-13T09:21:45.343 に答える
-1

インターフェイスで継承の力を使用する

public interface IMyInterface : Control
{
  ..
}

ここで、いくつかの特別なメソッドを持つコントロールが必要だと言います。


編集: TcKs はもちろん正しい..具体的なクラスからインターフェイスを継承することはできません。

この問題を解決する 1 つの方法は、コントロールを返すプロパティまたはメソッドを使用してインターフェイスを拡張することです。

サンプル:

public interface IMyInterface 
{
  Control Control { get; }

  [..rest of the definition..]
}

そしてそれを次のように実装します:

class MyControl : Control, IMyInterface
{
  public Control Control { get { return this; } }

  [..rest of the implementation..]
}
于 2008-11-13T09:11:28.860 に答える
-1

これは根本的に間違っているように聞こえます。

IMyInterface は Control クラスと同じメソッド/プロパティのみを宣言していますか? そうでない場合、何を達成したいと考えていますか? インターフェイスを実装して、その中で宣言されたメソッドを無視することはできません。実装を明示的に書き出す必要があります。

実際、IMyInterface が Control クラスと同じメソッド/プロパティのみを宣言する場合は、Control から継承して IMyInterface を実装する独自の MyControl クラスを作成する必要があります。これは言語の愚かな癖ではありません。Control クラスは IMyInterface として定義されておらず、C# は静的に型付けされた (「ダック型」ではなく) 言語であるため、必要なインターフェイスを Control に自動的に与えることはできません。

于 2008-11-13T17:47:01.230 に答える