使用抽象类何时有意义
When does it make sense to use an abstract class
我正在从C到C 过渡,当然,事实证明,这比预期的要困难得多。困难不是了解阶级和继承的核心机制,而是如何使用它。我已经阅读了有关设计模式的书,但它们仅显示技术并描绘了为什么应该使用这些技术的模糊图片。我真的很难找到抽象课程的用途。以下面的代码为例。
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() {}
我经常在设计书中看到这样的抽象课程。我知道,通过这种配置,继承的类可以访问基类的公共成员。我知道虚拟功能是继承类的占位符。问题是我仍然不明白这是如何有用的。我正在尝试将其与超载功能进行比较,而我只是没有看到实际用途。
我真正想要的是给某人提供最简单的示例,以说明为什么抽象类实际上是有用的,并且是对情况的最佳解决方案。不要误会我的意思。我并不是说没有好的答案。我只是不明白如何正确使用它们。
抽象类和接口都允许您定义一个期望实现子类的方法签名:姓名,参数,异常和返回类型。
抽象类可以提供默认实现如果存在明智的一个。这意味着子类不必实施这种方法。如果他们选择的话,他们可以使用默认实现。
接口没有这样的选择。实现接口的类是所需的以实现其所有方法。
在Java中,区别很明显,因为该语言包含关键字interface
。
c 接口是具有所有virtual
方法以及纯虚拟破坏者的类。
当您想将接口与实现分解时,使用抽象类和接口。当您知道您可以选择几个实现或编写一个允许客户插入自己的实现的框架时,它们很有用。该界面提供了期望客户遵守的合同。
抽象类的一种用途是能够轻松地在不同的混凝土实现之间切换,对代码的更改最小。您可以通过向基类类型的参考变量声明来做到这一点。对派生类别的唯一提及是在创建期间。所有其他代码均使用基类参考。
抽象类用于提供某些要实现隐藏细节的概念的抽象表示。
例如,假设我要实现文件系统接口: -
在抽象层面上我能想到什么?
class FileSystemInterface
{
virtual void openFile();
virtual void closeFile();
virtual void readFile();
virtual void writeFile();
};
在此时间点,我没有想到任何具体的内容,例如在Windows或Linux中如何处理它们,而是专注于某种抽象的想法。
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 从头开始为应用程序创建 docker 映像是否有意义?
- 在c++中,如果首先禁止默认构造,那么禁止复制构造有意义吗
- sizeof(函数)有意义吗?
- 二进制模式 + 格式化文本操作或文本模式 + 二进制数据操作 - 有意义吗?
- 插入向量时,使用lambda的返回而不是函数的返回是否有意义?
- 在 C++17 中使用 const std::string& 参数有意义吗?
- 基础类模板参数的有意义名称
- 内联这个函数,确实有意义
- 将 final 关键字添加到没有基类(未派生)的类中的虚函数是否有意义
- 左移负整数为零是否有意义?
- 是否有一个上下文表达式`a.b :: c`有意义
- 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义是合理的
- 将可选与reference_wrapper相结合是否有意义?
- 函数返回rvalue参考是否有意义
- 将 [[noreturn]] 添加到主函数是否有意义
- 在shared_ptr的自定义删除器中检查 nullptr 是否有意义?
- 使用抽象类何时有意义
- 关闭栅格化步骤何时有意义