【问题标题】:When does it make sense to use an abstract class什么时候使用抽象类有意义
【发布时间】:2017-03-05 01:53:10
【问题描述】:

我正在从 c 过渡到 c++,当然,事实证明 OOP 比预期的要困难。困难不在于理解类和继承的核心机制,而是如何使用它。我读过关于设计模式的书,但它们只展示了这些技术,并模糊地描绘了为什么应该使用这些技术。我真的很难找到抽象类的用途。以下面的代码为例。

class baseClass {
public:
    virtual void func1() = 0;
    virtual void func2() = 0;
};
class inhClass1 : baseClass {
public:
    void func1();
    void func2();
};
class inhClass2 : baseClass{
public:
    void func1();
    void func2();
};
int main() {}

我经常在设计书籍中看到这样设置的抽象类。我知道通过这种配置,继承的类可以访问基类的公共成员。我知道虚函数是继承类的占位符。问题是我仍然不明白这有什么用。我试图将它与重载函数进行比较,但我没有看到实际用途。

我真正想要的是有人给出最简单的例子来说明为什么抽象类实际上是有用的,并且是针对某种情况的最佳解决方案。不要误会我的意思。我并不是说没有一个好的答案。我只是不明白如何正确使用它们。

【问题讨论】:

  • 你了解接口的概念吗?
  • 不完全。我读过它们,但我真的不明白它们。据我了解,基类将是一个接口。至少在这个例子中。
  • 显示的代码中没有抽象类。
  • 哇,现在我真的很困惑。
  • @mreff555 ABC 可用于在 c++ 中创建接口,因为 c++ 没有像 Java 这样的显式接口。长话短说,如果一个类实现了一个接口,你就知道它有一定的功能。 ABC 允许您拥有一个接口,该接口还包含可以由实现者共享的代码。

标签: c++ oop abstract-class


【解决方案1】:

抽象类和接口都允许您定义子类应实现的方法签名:名称、参数、异常和返回类型。

抽象类可以提供一个默认实现如果存在一个合理的实现。这意味着子类不必实现这样的方法;如果他们愿意,他们可以使用默认实现。

接口没有这样的选项。实现接口的类必须实现其所有方法。

在 Java 中,区别很明显,因为该语言包含关键字 interface

C++ 接口是具有所有 virtual 方法以及纯虚析构函数的类。

当您想将接口与实现分离时,使用抽象类和接口。当您知道您将有多个实现可供选择时,或者当您正在编写一个允许客户端插入他们自己的实现的框架时,它们很有用。该接口提供了客户应遵守的合同。

【讨论】:

  • 请注意,这是一个 C++ 问题,而不是 Java 问题。
  • 我知道。接口的概念超越了 Java 和 C++。在 C++ 中,它将是一个包含所有虚方法和纯虚析构函数的类。
  • 可以,只要理解为一般概念而不是关键字即可。只是想澄清一下。
【解决方案2】:

抽象类的一个用途是能够轻松地在不同的具体实现之间切换,而只需对代码进行最少的更改。您可以通过向基类类型声明一个引用变量来做到这一点。派生类的唯一提及是在创建期间。所有其他代码都使用基类引用。

【讨论】:

  • “编码到接口”而不是特定的实现。
【解决方案3】:

抽象类用于提供您想要实现隐藏细节的某些概念的抽象表示。

例如,假设我要实现文件系统接口:-

在抽象层面我能想到什么?

class FileSystemInterface
{
    virtual void openFile();
    virtual void closeFile();
    virtual void readFile();
    virtual void writeFile();
};

目前,我并没有考虑任何具体的事情,比如如何在 Windows 或 linux 中处理它们,而是专注于一些抽象的想法。

【讨论】:

  • 这似乎很有用,如果这个问题看起来很无知,我很抱歉,但我从 c99 和重载函数开始。您仍然需要编写其他类。编写额外的抽象类有什么好处?
  • 主要好处是您将编程到接口而不是实现。因此,稍后您可以以任何您希望的方式更改实现,而不会影响您的客户。
猜你喜欢
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2013-10-07
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
相关资源
最近更新 更多