3

同じインターフェイスから継承し、メソッド呼び出しを受け取るインスタンスと同じクラスのオブジェクトのみを受け入れる vb.net インターフェイスでメソッドを定義しようとしています。これはvb.netで可能ですか?

以下では、(無効な) ジェネリック型の制約を使用して、何をしたいのかを説明しようとしています。

Public Interface IFoo

   CompareStuff(Of T as sametype)(obj as T) as Boolean

End Interface
4

3 に答える 3

4

あなたはCuriously recurring template patternを探しています。

私は私のVBで少し錆びているので、ここではC#です

public interface IFoo<T>
    where T : IFoo<T>
{
    bool CompareStuff(T obj);
}

次に、このように実装します

public class Foo : IFoo<Foo>
{
    bool CompareStuff(Foo obj);
}

これについては、Eric Lippert の記事をご覧ください。彼が次のように言っている最後に特に注意してください。

私のアドバイスは、C# でこの種の興味深いパターンを実装する前に、よく考えることです。顧客にとってのメリットは、コード管理者に課している精神的負担に関連するコストを本当に上回っていますか?

于 2012-07-03T19:12:04.677 に答える
2
Public Interface IFoo(Of T)
    CompareStuff(obj As T) As Boolean

次のように使用します。

Public Class Foo Implements IFoo(Of Foo)
    Function CompareStuff(obj As Foo) As Boolean

残念ながら、これをコンパイルすることもできます:

Public Class Bar Implements IFoo(Of Foo)
    Function CompareStuff(obj As Foo) As Boolean

現在、適切に制約するものは何も考えられません。

于 2012-07-03T09:27:57.547 に答える
1

typeが typeXから派生しY、 aYが別の に対して何らかの操作を実行できるY場合、Liskov Substitution Principle は、 aYが に対して同じアクションを実行できなければならずX、また、Xが a に対して同じアクションを実行できなければならないことを必要としますY。これらの要件をまとめると、 はX別の に対してその操作を実行できなければなりませんX

が別のに対してXなんらかの操作を実行できる可能性があることに注意してください。XY

ちなみに、IEquatable<T>構造体と封印されたクラスに対して実装すると便利ですが、任意のオブジェクトが他のオブジェクトと等しいかどうかという問題は、任意の型の任意の 2 つのオブジェクトに対して有意義に答えることができます。たとえば、 のコレクションがあるCat場合、そのコレクション内のオブジェクトをタイプSiameseCat(コレクションには のインスタンスが含まれる場合がありますがPersianCat、タイプ の一部が含まれる場合もありますSiameseCat) またはタイプAnimal(渡された一部のオブジェクトはタイプDog. である可能性がありますが、他のオブジェクトは タイプCat) である可能性があります。のコレクションにクエリを実行Catして特定のものが含まれているかどうかを確認するのはDog「ばかげている」かもしれませんが、コレクションはクエリに問題なく応答する必要があります (「インスタンスが見つかりません」)。

于 2012-07-03T19:07:01.253 に答える