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

时间:2020-03-05 18:44:36  来源:igfitidea点击:

Chave是否有私有/受保护的继承的概念?如果没有,为什么?

C ++

class Foo : private Bar {
 public:
   ...
 };

C#

public abstract NServlet class : private System.Web.UI.Page
{
    // error "type expected"
}

我正在.aspx页中实现"类似于servlet"的概念,但我不希望具体的类具有查看System.Web.UI.Page基础内部的能力。

解决方案

回答

不,仅公共继承。

回答

我们可能想要一个与NServlet实现挂钩的ServletContainer类。在我的书中,不允许私有/受保护的继承并不是什么大问题,并且可以使语言与LINQ等保持更少的混淆。我们已经准备好了足够的东西来记住。

回答

不,不是。允许这种限制有什么好处?

回答

通过将类中的相同成员声明为private并使用new关键字,可以隐藏继承的API,使其不被公共看到。请参阅从MSDN隐藏继承。

回答

如果我们想让NServlet类对Page一无所知,则应考虑使用Adapter模式。编写一个页面,该页面将托管NServlet类的实例。然后,根据确切工作,我们可以编写各种只了解基类NServlet的类,而不必使用asp.net页面成员来污染API。

回答

仅继承公共继承。 C ++允许所有这三种。公共继承暗含" IS-A"类型的关系,而私人继承暗含" Is-Implemented-In-Terms-Of"类型的关系。由于分层(或者组合)以一种可能更简单的方式完成了此任务,所以根据有效C ++中项目42的Scott Meyers的说法,仅在受保护成员绝对需要或者虚拟函数需要私有继承时才使用私有继承。

我的猜测是Cdid的作者认为没有必要用这种额外的方法来实现另一类的实现。

回答

@bdukes:
请记住,我们并没有真正隐藏成员。例如。:

class Base
{
   public void F() {}
}
class Derived : Base
{
   new private void F() {}
}

Base o = new Derived();
o.F();  // works

编辑:但这完成了与C ++中的私有继承相同的功能,这是发问者想要的:)

回答

No it doesn't. What would the benefit be of allowing this type of restriction?

私有继承和受保护继承对于封装(信息隐藏)很有用。尽管Java中不支持Protected *继承,但C ++支持。这是我的项目中有用的示例。

在第3方框架中有一个基类**。它具有数十种设置,以及用于操作它们的属性和方法。当分配了各个设置时,基类不会进行大量检查,但是如果遇到不可接受的组合,它将在以后生成异常。

我使用分配这些设置的方法(例如,从文件分配精心制作的设置)制作子类。最好拒绝代码的其余部分(在我的子类之外)操纵单个设置并将其弄乱的功能。

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

***为简便起见,将使用"受保护的"而不是"私有和受保护的"。

**就我而言,是National Instruments Measurement Studio。

  • 缺口