Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#私有(隐藏)基类_C#_Inheritance_Private_Base Class - Fatal编程技术网

C#私有(隐藏)基类

C#私有(隐藏)基类,c#,inheritance,private,base-class,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 su

是否可以使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#不允许基类比子类具有更严格的访问权限,但是有没有其他合法的方法可以达到同样的效果

更新

我对这个特定库的解决方案是将基类
公开
抽象
,并用“不要直接使用这个基类”来记录它。我还使基类的构造函数
成为内部的
,这有效地防止了外部客户机使用或继承该类


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

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


您需要公开基类,或者需要声明所有类似类的所有方法。如果您再次声明所有方法,那么创建一个helper类可能很有用,该类具有它们的实际实现。尽管如此,它还是有点陈词滥调。

考虑一种模式,例如正面。这就是他们在那里的目的。我认为直接继承无法实现您所需的功能。

根据“许多常用方法”所做的工作,您可以通过内部扩展方法实现其中的一些功能:

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

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

太糟糕了。Java允许我这样做,因为它有时会为我节省很多样板文件。例如,在几个类中实现同一接口时,关键是将尽可能多的常用方法和变量放入共享基类中,这样就不必在每个子类中都编写它们。这是基类更常见的用途之一,即共享实现代码,而不是不必要地复制代码。我不想创建很多转发方法。隐藏基类背后的全部要点是避免复制大量(公共)方法。事实上,不管怎样,人们都应该支持组合而不是继承()@jeroenh-这与我的观点正好相反。我希望基类实现大多数方法和变量,并且希望每个派生子类实现的尽可能少。为什么不将
BaseOutput
的构造函数设置为内部,这样就没有外部代码可以从中继承?@mikez:是的,我就是这么做的,请参阅上面的更新。带有内部构造函数的公共类可能是更好的选择(我的答案中的示例)