2 つのクラスで、抽象基本クラスD1
からD2
派生しB
ます。それらのそれぞれは、で宣言された共通のパブリック インターフェイスを共有しますがB
、それぞれが独自の特定のパブリック インターフェイスを持つ場合もあります (たとえば、オブジェクトに対してのみ意味のあるD2
has )。D2.Bar()
D2
public abstract class B
{
public int N { get; set; }
public abstract void Foo();
}
public class D1 : B
{
public override void Foo()
{
}
}
public class D2 : B
{
public override void Foo()
{
}
public void Bar()
{
}
}
Bar()
コレクションのすべてのオブジェクトで共通の (継承された) メソッドを呼び出さなければならない場合もありますが、D2
オブジェクトのみを呼び出したい場合もあるため、派生オブジェクトを 1 つのコレクション (リストなど) に混在させておきます。
var list = new List<B>();
list.Add(new D1());
list.Add(new D2());
foreach(var b in list)
if(b is D2)
(b as D2).Bar();
ここにコードの匂いがします。ダウンキャストは悪い考えです。型チェックに基づいて決定を下すのは悪い考えです。基本クラスに移動すると、オブジェクトBar()
でそれを呼び出す意味がありません( containの実装は何ですか? )。インターフェイスと構成も役に立ちません。これは非常に一般的な状況だと思いますが、この場合のベストプラクティスは何ですか? ダウンキャストを回避しながら、派生型に固有のパブリック メソッドの呼び出しを許可するにはどうすればよいですか?D1
D1.Bar()