是否可以使C#基类只能在它编译成的库程序集中访问,同时使从其继承的其他子类公开?
例如:
using System.IO;
class BaseOutput: Stream // Hidden base class
{
protected BaseOutput(Stream o)
{ ... }
...lots of common methods...
}
public class MyOutput: BaseOutput // Public subclass
{
public BaseOutput(Stream o):
base(o)
{ ... }
public override int Write(int b)
{ ... }
}
在这里,我希望我的库的客户端无法访问BaseOutput
类,但允许子类MyOutput
完全公开。我知道C#不允许基类比子类具有更多限制性访问,但是还有其他合法方法可以实现相同的效果吗?
更新
我对此特定库的解决方案是创建基类public
和abstract
,并使用“不要直接使用此基类”来记录它。我还创建了基类internal
的构造函数,它有效地防止外部客户端使用或继承该类。
(这很遗憾,因为其他O-O语言让我有隐藏的基类。)
答案 0 :(得分:12)
不幸的是没有。您无法从内部或私人类派生公共类。
您需要公开基类,或者需要为所有类似的类声明所有方法。如果你去再次声明所有方法的路径,那么创建一个helper类可能很有用,它有实际的实现。仍然是相当多的样板。
答案 1 :(得分:5)
考虑诸如Facade之类的模式。这就是他们的目的。我不认为你可以通过直接继承实现你所需要的。
答案 2 :(得分:1)
根据“许多常用方法”的作用,您可以使用内部扩展方法实现其中一些:
internal static class MyStreamExtensions
{
internal static int UsefulOne(this Stream stream)
{
return 42;
}
}
另一种方法是使构造函数内部化以防止从该类无意中派生:
public class BaseOutput: Stream
{
internal BaseOutput(Stream o)
{ ... }
...lots of common methods...
}
与层次结构中“不真实可见”的中间类相比,这将使代码更容易理解。