OOP中的抽象:多个但相当不同的上下文?

时间:2017-12-31 06:49:50

标签: oop inheritance design-patterns abstraction

我一直在研究OOP概念,并且在尝试理解 Abstraction 究竟是什么时遇到了一些问题。我已经浏览了很多关于该主题的 Stack Overflow 帖子,但还没有真正找到令人满意的答案。

我已经看过很多关于 Abstraction Encapsulation 之间差异的讨论,并且自然而然地开始考虑 Abstraction 隐藏特定类的工作方式并通过类API提供抽象。以下是一些引导我朝这个方向发布的帖子:

但是,当我阅读更多帖子时,我注意到在继承上下文中描绘 Abstraction 的答案,特别是使用接口和抽象类来提供某个实体的 Abstraction (类)。我假设以这种方式给出的 Abstraction 将允许开发人员根据 Abstraction 概述的“指南”适当地扩展新对象。以下是一些引导我朝这个方向发布的帖子:

我不确定我是否完全忽略了这一点,但它变得相当混乱,因为每个答案似乎都会增加一点点变化。我确实明白为什么两个上下文在面向对象编程中都是至关重要的,但我真的想要对抽象是什么有一个明确的定义。

这让我想到了: Abstraction 在多个环境中工作吗? Abstraction 是否描述了这两个概念?

  1. 通过接口和方式隐藏“不必要的细节” 抽象类

    • 通过接口和抽象类为要创建的类提供抽象。我们可以提供IPet的接口,它将充当Dog类的抽象。另外,我们可以提供一个Animal基类作为抽象类来提供更高级别的抽象。这可以让我们使用多态,并允许属于我们Animal抽象的不同类相互交互。
  2. 通过类API公开来抽象类的实现

    • 给定一个Dog类,我们只需要知道它有一个feed()函数作为其API的一部分,并调用该函数来提供它而不知道如何实际执行馈送。这提供了Dog类的抽象,让我们可以轻松地与类
    • 进行交互
  3. 我上面提到的其中一个链接包含Matthew Watson的以下引用:

      

    “问题是这些概念没有精确的定义,即使在面向对象的背景下,这些词本身也有多重含义。”

    只是 Abstraction 是如此抽象,即使定义是抽象的:P?感谢您提前获得任何指导!

    编辑:我对SO很新,并不是真正意识到“主要基于意见”的旗帜所包含的内容。我不明白这个问题是如何比关于抽象的一系列问题更有效。我认为它会被认为不那么基于意见,因为我实际上指出了两种不同的背景,我认为抽象是有意义的。我看到很多问题只是问什么抽象是什么,我认为是更广泛的问题比我在这里。

2 个答案:

答案 0 :(得分:1)

对我而言,抽象是oo最美丽的概念之一,这实际上是使程序语言与人类思维非常接近的原因:我们,人类总是想要分类。想想一辆车:你的车。让我们在银行家的背景下接近那辆汽车,在贷款的背景下询问你的资产:你会说你有资产(最高抽象水平):昂贵的汽车,家用汽车,房子,船等等他们都有特定的价值。然后假设谈话的背景切换到对该车有个人兴趣的银行家,因为他是一个汽车怪他自己。现在将更详细地描述汽车,你可以看到不同的抽象级别被定义:具有品牌名称的跑车,以及更多的特征。

在设计期间,您的兴趣是关于抽象级别:您想要用它做什么,即它的上下文。因此,我们将拥有抽象级别:资产,汽车(和船和房子),SportCar,FamilyCar。等等。上下文应该永远不会有比它需要的更多细节,这是你在设计阶段所关心的。

在实施阶段,您将通过封装属于这些级别的属性来实现这些抽象级别。例如。资产有一个值,其中Car有颜色,SportCar可能有一些FamilyCar没有的特定特征。

因此,关键的区别在于:设计时间与实施时间。

这篇博文详细描述了不同之处: http://javarevisited.blogspot.be/2017/04/difference-between-abstraction-and-encapsulation-in-java-oop.html

这是stackoverflow的另一篇文章:What's the difference between abstraction and encapsulation?

希望这有帮助。

答案 1 :(得分:0)

至于我,抽象就是当你解决一个问题而根本没有进入细节时。如果您需要输出汽车列表,那么我不认为“获取汽车列表,浏览它们,获取数据,打印它们”,我宁愿认为“我需要一组可以显示的物体,最好是汽车以我需要的格式提供有关自己的数据。“它更多的是思考方式。