次のようなクラスがあるとしましょう。
public abstract class Foo
{
public void Access(Foo foo)
{
/*
if (foo is same type as implemented)
AccessIfSameImplementation(foo);
else
AccessIfDifferentImplementation(foo);
*/
}
protected abstract void AccessIfSameImplementation(Foo foo);
private void AccessIfDifferentImplementation(Foo foo)
{
//do stuff with the different implementations
}
}
したがって、メソッドAccess
はそれ自体の型を取り、定義により、継承している限り、それが何であるかをあまり気にしない実装になりFoo
ます...しかし、このメソッドに、渡されたオブジェクトがその実装と同じ型。
そのようです:
public class Bar : Foo
{
protected override void AccessIfSameImplementation(Foo foo)
{
// TODO: How do I force foo to always be a Bar
// do specific Bar stuff
}
}
現在、渡されたものが現在のものと同じName
かどうかを示すフィールドがあります。さらに、ジェネリックを使用することも考えましたが、それがこの問題に対する正しいアプローチだとは思いません。foo.Name
Name
編集:
私が使用している実際の構造について少し背景を説明します。
上記Foo
で定義されたクラスは、一連のオブジェクトを作成するファクトリを表しています。List<X> objs
これらのオブジェクトは、実装されたFoo
オブジェクトのプロパティによって生成されます。現在、これらのファクトリを比較する別のクラスがありますが、ファクトリがすべて生成されることで肥大化することは望んでいません。したがって、ファクトリを肥大化させる代わりに、実装が同じかどうかをチェックするだけです。実装が同じである場合は、抽象比較子によって定義されたプロパティを比較し、そうでない場合は吹き飛ばします。後で時間があれば追加します。
もっといいタイトルがあれば、おすすめを教えてください。