次の継承ツリーが与えられた場合、機能する方法でそれを実装する最良の方法は何でしょうか?
abstract class Foo<T> : IEnumerable<T>
{
public abstract Bar CreateBar();
}
class Bar<T> : Foo<T>
{
// Bar's provide a proxy interface to Foo's and limit access nicely.
// The general public shouldn't be making these though, they have access
// via CreateBar()
protected Bar(Foo base)
{
// snip...
}
}
class Baz<T> : Foo<T>
{
public Bar CreateBar()
{
return new Bar(this);
}
}
これは失敗します: 'Bar.Bar()' is inaccessible due to its protection level
.
コンストラクターをパブリックにしたくありません。継承するクラスのみがsFoo
を作成できる必要がありますBar
。Bar
は特殊なFoo
であり、どのタイプの もFoo
作成できるはずです。public internal は、ここでは「オプション」です。定義済みの拡張機能の大部分はFoo
DLL の内部にあるためです。ただし、後で独自の型のFoo
or Baz
(これは発生する可能性が高い) は、デフォルトのCreateBar()
実装に固執し、ニーズを満たす場合と満たさない場合があります。
おそらく、これをリファクタリングしてうまく機能させる方法はありますか?私はこれを設計しようとして壁に頭をぶつけていますが、うまくいきます。
編集 (詳細):
もう少し具体的に: Foo は IEnumerable を実装しており、簡単に言えば、Bar は同じインターフェイスを提供していますが、その列挙可能なオブジェクトの限られたサブセットに提供しています。すべての Foo は、自分自身のサブセット (つまり、Bar) を作成して返すことができる必要があります。しかし、Foo を実装したいすべての人にこれを心配させたくありません。なぜなら、Bar がプロキシを行い、範囲の制限などを心配するからです。