18

是否可以使 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,有效地防止了外部客户端使用或继承该类。

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

4

3 回答 3

14

不幸的是没有。您不能从内部或私有类派生公共类。

您需要公开基类,或者需要为所有类似类声明所有方法。如果您再次声明所有方法的路线,那么创建一个具有它们的实际实现的辅助类可能很有用。仍然是相当多的样板。

于 2012-06-01T22:32:54.427 回答
5

考虑一个模式,例如 Facade。这就是他们的目的。我不认为你可以通过直接继承来实现你所需要的。

于 2012-06-01T22:33:03.277 回答
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...
}

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

于 2012-06-01T23:03:46.670 回答