【发布时间】:2017-12-31 06:49:49
【问题描述】:
我一直在对 OOP 概念进行一些研究,但在尝试理解 抽象 到底是什么时遇到了一些问题。我浏览了很多关于该主题的 Stack Overflow 帖子,但还没有真正找到令人满意的答案。
我看到很多关于抽象和封装之间区别的讨论,自然而然地开始从以下方面思考抽象隐藏特定类的工作方式并通过类 API 提供抽象。以下是一些引导我朝这个方向发展的帖子:
- Best voted answer refers to functions being Abstract. The very next answer starts talking about abstract classes...
- Best voted answer seems to refer to exposing through the class API while the next two goes off in an Inheritance setting. Third answer even suggests Composition and Aggregation is considered an Abstraction
但是,当我阅读更多帖子时,我注意到在继承上下文中描述抽象的答案,特别是使用接口和抽象类来提供某个实体的抽象 (班级)。我假设以这种方式给出的 Abstraction 将允许开发人员根据此 Abstraction 概述的“准则”适当地扩展新对象。以下是一些将我引向这个方向的帖子:
- First couple of answers talk about Abstraction in an abstract class/interface setting, while some down the line start talking about exposing classes through APIs
- Top two voted answers refer to abstract classes/interfaces
我不确定我是否完全错过了这里的重点,但它变得非常令人困惑,因为每个答案似乎都在混合中添加了轻微的变化。我绝对明白为什么这两种上下文在面向对象编程中都很重要,但我真的想要一个明确的抽象定义。
这让我明白了:抽象在多种情况下是否有效? 抽象是否同时描述了这两个概念?
-
隐藏“不必要的细节”,就像通过接口和 抽象类
- 为要通过接口和抽象类创建的类提供抽象。我们可以提供一个
IPet的接口,它可以作为Dog类的抽象。此外,我们可以提供一个Animal基类作为抽象类来提供更高级别的抽象。这可以让我们使用多态性并允许属于我们Animal抽象的不同类相互交互。
- 为要通过接口和抽象类创建的类提供抽象。我们可以提供一个
-
通过类 API 公开类的实现来抽象类的实现
- 给定一个
Dog类,我们只需要知道它有一个feed()函数作为其API 的一部分,并调用该函数来馈送它,而无需知道馈送实际上是如何完成的。这提供了Dog类的抽象,让我们可以轻松地与该类进行交互
- 给定一个
我上面包含的一个链接包含 Matthew Watson 的以下引用:
“问题是这些概念没有精确的定义,即使在面向对象的上下文中,这些词本身也有多重含义。”
难道只是抽象这么抽象,连定义都是抽象的:P?感谢您提前提供任何指导!
编辑:我对 SO 比较陌生,并不真正了解“主要基于意见”标志的含义。我看不出这个问题比关于 SO 上的抽象的一系列问题更有效。我认为它会被认为不那么基于意见,因为我实际上是在指出我认为抽象在其中有意义的两种不同背景。我看到很多问题只是问抽象是什么,我认为这是一个更广泛的问题问题比我在这里。
【问题讨论】:
-
我完全同意马修·沃森的观点。我认为每个人对抽象的定义都略有不同。但我想每个人都会同意第 1 点和第 2 点都可以被视为抽象的一个例子。
标签: oop inheritance design-patterns abstraction