给定以下继承树,以有效的方式实现它的最佳方法是什么?
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 将进行代理并担心限制范围等。
好的,新答案:
- 将 Bar 拆分为接口和具体类。
- 用 IBar 表达公共抽象方法。
- 将 Bar 设为 Foo 中的私有嵌套类,实现 IBar。给它一个可以从 Foo 调用的内部构造函数。
- 在 Foo 中编写一个受保护的方法,该方法从自身创建 Bar 的实例。如果仅代理就足够了,从 Foo 派生的类可以使用它来实现抽象方法,而需求更复杂的类可以直接实现 IBar。您甚至可以将抽象方法更改为虚拟方法,并默认从“this”创建一个新的 Bar。
编辑:对此的一个变体是使 Bar 成为受保护的Foo 中的嵌套类,具有公共构造函数。这样,任何派生类都能够为自己实例化它,但不相关的类根本无法“看到”它。您仍然需要将接口与实现分开(以便接口可以是公共的),但我认为无论如何这是一件好事。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)