C#私有(隐藏)基类
是否可以使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
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:是的,我就是这么做的,请参阅上面的更新。带有内部构造函数的公共类可能是更好的选择(我的答案中的示例)