给定以下继承树,以有效的方式实现它的最佳方法是什么?
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
。
我不希望构造函数是公开的,只有继承自的类Foo
才能创建Bar
s。Bar
是一个专门Foo
的,任何类型的Foo
都应该能够创建一个。公共内部在这里是一个“选项”,因为大多数预定义的扩展都Foo
将在 DLL 内部,但我认为这是一个草率的答案,因为后来出现的任何人想要创建自己的Foo
or类型Baz
(即可能发生)将被默认CreateBar()
实现卡住,这可能会也可能不会满足他们的需求。
也许有一种方法可以重构它以使其正常工作?我正在努力设计这个,所以它会起作用。
编辑(更多信息):
稍微具体一点:Foo 正在实现 IEnumerable,长话短说,Bar 提供了相同的接口,但只针对该可枚举对象的有限子集。所有 Foo 都应该能够创建自己的子集(即 Bar)并返回它。但我不想让每个想要实现 Foo 的人都担心这个,因为 Bar 会做代理并担心限制范围等。