同じインターフェイスから継承し、メソッド呼び出しを受け取るインスタンスと同じクラスのオブジェクトのみを受け入れる vb.net インターフェイスでメソッドを定義しようとしています。これはvb.netで可能ですか?
以下では、(無効な) ジェネリック型の制約を使用して、何をしたいのかを説明しようとしています。
Public Interface IFoo
CompareStuff(Of T as sametype)(obj as T) as Boolean
End Interface
あなたは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# でこの種の興味深いパターンを実装する前に、よく考えることです。顧客にとってのメリットは、コード管理者に課している精神的負担に関連するコストを本当に上回っていますか?
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
現在、適切に制約するものは何も考えられません。
typeが typeX
から派生しY
、 aY
が別の に対して何らかの操作を実行できるY
場合、Liskov Substitution Principle は、 aY
が に対して同じアクションを実行できなければならずX
、また、X
が a に対して同じアクションを実行できなければならないことを必要としますY
。これらの要件をまとめると、 はX
別の に対してその操作を実行できなければなりませんX
。
が別のに対してX
なんらかの操作を実行できる可能性があることに注意してください。X
Y
ちなみに、IEquatable<T>
構造体と封印されたクラスに対して実装すると便利ですが、任意のオブジェクトが他のオブジェクトと等しいかどうかという問題は、任意の型の任意の 2 つのオブジェクトに対して有意義に答えることができます。たとえば、 のコレクションがあるCat
場合、そのコレクション内のオブジェクトをタイプSiameseCat
(コレクションには のインスタンスが含まれる場合がありますがPersianCat
、タイプ の一部が含まれる場合もありますSiameseCat
) またはタイプAnimal
(渡された一部のオブジェクトはタイプDog
. である可能性がありますが、他のオブジェクトは タイプCat
) である可能性があります。のコレクションにクエリを実行Cat
して特定のものが含まれているかどうかを確認するのはDog
「ばかげている」かもしれませんが、コレクションはクエリに問題なく応答する必要があります (「インスタンスが見つかりません」)。