C#私有(隐藏)基类(C# private (hidden) base class)

2019-09-17 17:21发布

是否有可能只作中的库组装它编译成可访问的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#不允许基类具有比子类更严格的访问,但有获得同样的效果的一些其他合法的方式?

UPDATE

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

(这是一个耻辱,因为其他面向对象的语言,让我有隐藏的基类。)

Answer 1:

不幸的是没有。 您无法从内部或私有类派生一个公共类。

您需要任何暴露的基类,或者你需要的所有声明为所有类似的类的方法。 如果你走到哪里,你再次声明的所有方法的路线,它可能是有用的创建一个辅助类,其中有实际执行起来。 不过这是相当多的样板。



Answer 2:

考虑一个模式,如门面。 这就是他们来这里的目的。 我不认为你可以实现你需要直继承什么。



Answer 3:

根据什么“很多常用的方法”正在做的,你可以实现它的一些内部扩展方法:

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

这将使得代码更容易理解相比于层次结构“不真正可见的”中间阶级。



文章来源: C# private (hidden) base class