C#是否具有私有/受保护继承的概念,如果没有,为什么?
C++
class Foo : private Bar {
public:
...
};
C#
public abstract NServlet class : private System.Web.UI.Page
{
// error "type expected"
}
我在.aspx页面中实现了一个"servlet like"概念,我不希望具体类能够看到System.Web.UI.Page基础的内部.
C#只允许公共继承.C++允许这三种.公共继承意味着"IS-A"类型的关系,而私有继承意味着"Is-Implemented-In-Terms-Of"这种关系.由于分层(或组合)以一种可以说是更简单的方式完成了这一过程,私有继承仅在被保护成员或虚拟功能需要它时才使用 - 根据Scott Meyers的Effective C++,Item 42.
我的猜测是,C#的作者并不觉得有必要使用另一个类来实现另一个类.
不,不.允许这种限制会带来什么好处?
私有和受保护的继承有利于封装(信息隐藏).C++支持受保护的*继承,尽管它不在Java中.这是我的项目中的一个例子,它将是有用的.
第三方框架中有一个基类**.它有许多设置以及用于操作它们的属性和方法.在分配单个设置时,基类不会进行大量检查,但如果遇到不可接受的组合,它将在以后生成异常.
我正在制作一个子类,其中包含分配这些设置的方法(例如,从文件中分配精心设计的设置).很高兴否认代码的其余部分(在我的子类之外)能够操纵个别设置并搞砸它们.
也就是说,我认为在C++(同样支持私有和受保护的继承)中,可以将子类强制转换为父级,并可以访问父级的公共成员.(另请参阅Chris Karcher的帖子)尽管如此,受保护的继承可以改善信息隐藏.如果B1类的成员需要真正隐藏在其他类C1和C2中,可以通过在C1和C2中创建B1类的受保护变量来安排它.受保护的B1实例将可供C1和C2的儿童使用.当然,这种方法本身并不提供C1和C2之间的多态性.但是可以通过从公共接口I1继承C1和C2来添加多态性(如果需要).
***为简洁起见,将使用"受保护"而不是"私人和受保护".
**在我的案例中,National Instruments Measurement Studio.
缺口
您可以通过将类中的同一成员声明为private并使用new关键字来隐藏继承的API,使其不被公开显示.请参阅隐藏 MSDN中的继承.