【问题标题】:More methods in derived classes than base class派生类中的方法多于基类
【发布时间】:2013-03-13 14:06:07
【问题描述】:

我想问一个关于派生类案例中的编程风格的问题:

class A
{
public:
   virtual foo1()=0;
}

class B: public A
{
 public:
  virtual foo1();
  virtual foo2();
 }

class C: public A
{
 public:
  virtual foo1();
 }

int main() {
 B mB();
 C mC();
 mB.foo2() //OK!
 mC.foo2() // obviously, it is not correct
return 0;}

因此,派生类的公共方法应该少于或等于抽象基类吗?

如果派生类需要更多方法,这些方法应该是私有的吗?

【问题讨论】:

  • 创建派生类的原因之一是添加功能。这样做并坚持外部客户端不能使用附加功能是没有意义的。
  • 您在这里看到的是interface 的示例。接口用于向类添加功能。所以 A 通过添加 foo1 功能来完成它的工作。

标签: c++ coding-style polymorphism


【解决方案1】:

派生类几乎总是比基类拥有更多的公共函数。这就是继承的重点:您可以定义一个仅概述变量基本行为的抽象基类,然后派生类可以针对特定情况扩展此基本行为。

继承的类始终是基类的特化。它实现了更具体的功能(通常是更多的功能)。在您的示例中,您期望两个不同的专业化在基类定义的行为之外以相同的方式表现。 (foo2 未在 A 中定义)。这就是问题所在。如果您需要定义A 之外的常见行为,解决方案是创建一个中间类。

class Intermediate : public A
{
public:
    virtual foo1()=0;
    virtual foo2()=0;
}

class B: public Intermediate
{
public:
    virtual foo1();
    virtual foo2();
}

现在任何可以实现foo2 的类都应该扩展Intermediate,任何需要foo2 功能的函数都应该请求至少具有Intermediate 类型的变量。

【讨论】:

    【解决方案2】:

    这个类结构没有错。派生类拥有比父类更多的方法并没有错——这很常见。 mC.foo2(); 行是错误的,这不是类的错。

    【讨论】:

      【解决方案3】:

      派生类必须至少实现基类的ALL抽象方法。这是最低限度。如果您确实添加了其他方法、成员或其他任何内容。
      但是从类派生并且不添加任何内容并不是很聪明,因为这不是继承的目的(至少IS-A-relationships)。如果您选择private inheritance,可能会有所不同。

      【讨论】:

      • 一种解决方案可能是:具有所有基本抽象方法(set 和 get)的抽象类和实现所有抽象方法的派生类,仅通过私有方法添加功能
      【解决方案4】:

      在我从事的几乎所有项目中,我们的基类的功能都比派生类少 - 在极端情况下,基类甚至可能几乎没有功能,但派生类有几十个函数和一个六个成员变量。

      这正是派生类的本意。

      显然,您需要知道您拥有什么样的派生类,并且仅在派生类可用时才使用派生类的“额外”功能。

      【讨论】:

      • 是的,我想知道这是否可以被认为是一个糟糕的代码,因为它会产生一个错误。
      • 这不是一个错误——它是一个编译时错误,这在坏事的规模上要好得多。显然,如果 C 不需要 foo2() 方法,那么它不应该有一个。当然,在某些情况下,您确实希望所有派生类都“相同”。但是拥有一个类中没有其他成员/函数的类并没有错。
      猜你喜欢
      • 2018-05-16
      • 1970-01-01
      • 2017-04-03
      • 2021-07-06
      • 1970-01-01
      • 2014-03-17
      • 2014-09-05
      • 1970-01-01
      相关资源
      最近更新 更多