当前位置:  开发笔记 > 编程语言 > 正文

C#是否具有私有和受保护继承的概念?

如何解决《C#是否具有私有和受保护继承的概念?》经验,为你挑选了3个好方法。

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基础的内部.



1> Brian Stewar..:

C#只允许公共继承.C++允许这三种.公共继承意味着"IS-A"类型的关系,而私有继承意味着"Is-Implemented-In-Terms-Of"这种关系.由于分层(或组合)以一种可以说是更简单的方式完成了这一过程,私有继承仅在被保护成员或虚拟功能需要它时才使用 - 根据Scott Meyers的Effective C++,Item 42.

我的猜测是,C#的作者并不觉得有必要使用另一个类来实现另一个类.


它也可以具有"IS-A"的含义,但仅限于该类的范围.此外,即使在C++中的私有/受保护继承的情况下,后代也可以覆盖虚拟成员.组合并不总是取代私有继承,我有时会错过C#中的这个特性.
在这种情况下你可以简单地使用构图,我会说它们是正确的.

2> Nick Alexeev..:

不,不.允许这种限制会带来什么好处?

私有和受保护的继承有利于封装(信息隐藏).C++支持受保护的*继承,尽管它不在Java中.这是我的项目中的一个例子,它将是有用的.

第三方框架中有一个基类**.它有许多设置以及用于操作它们的属性和方法.在分配单个设置时,基类不会进行大量检查,但如果遇到不可接受的组合,它将在以后生成异常.

我正在制作一个子类,其中包含分配这些设置的方法(例如,从文件中分配精心设计的设置).很高兴否认代码的其余部分(在我的子类之外)能够操纵个别设置并搞砸它们.

也就是说,我认为在C++(同样支持私有和受保护的继承)中,可以将子类强制转换为父级,并可以访问父级的公共成员.(另请参阅Chris Karcher的帖子)尽管如此,受保护的继承可以改善信息隐藏.如果B1类的成员需要真正隐藏在其他类C1和C2中,可以通过在C1和C2中创建B1类的受保护变量来安排它.受保护的B1实例将可供C1和C2的儿童使用.当然,这种方法本身并不提供C1和C2之间的多态性.但是可以通过从公共接口I1继承C1和C2来添加多态性(如果需要).

***为简洁起见,将使用"受保护"而不是"私人和受保护".

**在我的案例中,National Instruments Measurement Studio.

缺口



3> bdukes..:

您可以通过将类中的同一成员声明为private并使用new关键字来隐藏继承的API,使其不被公开显示.请参阅隐藏 MSDN中的继承.


但是,您必须从新成员中调用原始成员以恢复原始成员的功能.这似乎不是一种特别干净的方式.更好的方法可能是使用组合而不是继承,仅在后代类中公开要公开的成员.
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有