C#private(隐藏)基类

时间:2012-06-01 22:31:08

标签: c# inheritance private base-class

是否可以使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#不允许基类比子类具有更多限制性访问,但是还有其他合法方法可以实现相同的效果吗?

更新

我对此特定库的解决方案是创建基类publicabstract,并使用“不要直接使用此基类”来记录它。我还创建了基类internal的构造函数,它有效地防止外部客户端使用或继承该类。

(这很遗憾,因为其他O-O语言让我有隐藏的基类。)

3 个答案:

答案 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...
}

与层次结构中“不真实可见”的中间类相比,这将使代码更容易理解。