C# 私有(隐藏)基类
Posted
技术标签:
【中文标题】C# 私有(隐藏)基类【英文标题】:C# private (hidden) base class 【发布时间】:2012-06-07 03:45:54 【问题描述】:是否有可能使 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# 不允许基类比子类具有更严格的访问权限,但是还有其他合法的方法可以达到同样的效果吗?
更新
我对这个特定库的解决方案是创建基类public
和abstract
,并用“不要直接使用这个基类” 来记录它。我还做了基类internal
的构造函数,有效地阻止了外部客户端使用或继承该类。
(很遗憾,因为其他 O-O 语言让我有隐藏的基类。)
【问题讨论】:
为什么不将BaseOutput
的构造函数设为internal,这样外部代码就不能继承了?
@mikez:是的,这就是我所做的,请参阅上面的更新。
具有内部构造函数的公共类可能是更好的选择(我的回答中的示例)
【参考方案1】:
很遗憾没有。您不能从内部或私有类派生公共类。
您需要公开基类,或者您需要为所有类似的类声明所有方法。如果您再次声明所有方法的路线,那么创建一个具有它们的实际实现的辅助类可能很有用。仍然是相当多的样板。
【讨论】:
太糟糕了。 Java 让我这样做。 因为它有时会为我节省不少样板文件。例如,在多个类中实现相同的接口时。 重点是将尽可能多的通用方法和变量放入共享基类中,这样您就不必在每个子类中都编写它们。这是基类更常见的用途之一,即共享实现代码而不是不必要地复制代码。【参考方案2】:考虑一个模式,例如 Facade。这就是他们的目的。我不认为你可以通过直接继承来实现你所需要的。
【讨论】:
我不想创建很多转发方法。隐藏基类背后的重点是避免复制大量(常用)方法。 确实,无论如何,人们都应该支持组合而不是继承 (en.wikipedia.org/wiki/Composition_over_inheritance) @jeroenh - 这与我的观点完全相反。我希望基类实现大部分的方法和变量,我希望每个派生子类实现尽可能少。【参考方案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# 私有(隐藏)基类的主要内容,如果未能解决你的问题,请参考以下文章