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

更新

我对这个特定库的解决方案是创建基类publicabstract,并用“不要直接使用这个基类” 来记录它。我还做了基类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# 私有(隐藏)基类的主要内容,如果未能解决你的问题,请参考以下文章

C#中继承类为啥可以通过属性访问基类的私有字段。

面向对象程序设计)

C#防止基类方法被派生类中的new修饰符隐藏

C# 隐藏方法和重写方法

开源web框架django知识总结

开源web框架django知识总结