我一直在研究OOP的概念,在试图理解抽象到底是什么的过程中遇到了一些问题。我已经浏览了很多关于这个主题的堆栈溢出帖子,但还没有找到一个令人满意的答案。
我已经看到了很多关于抽象和封装之间差异的讨论,并且很自然地开始从隐藏特定类的工作方式和通过类API提供抽象的角度来思考抽象。以下是一些引导我走向这个方向的帖子:
然而,当我阅读更多的文章时,我注意到答案描述了继承上下文中的抽象,特别是使用接口和抽象类来提供特定实体(类)的抽象。我假设以这种方式给出的抽象将允许开发人员根据该抽象概述的“指导原则”适当地扩展新对象。以下是一些引导我走向这一方向的帖子:
我不确定我是否完全忽略了这一点,但它变得相当混乱,因为每一个答案似乎都增加了一些细微的变化。我当然明白为什么这两种上下文在面向对象编程中都很重要,但我真的想要一个关于什么是抽象的清晰定义。
这就引出了我的观点:抽象在多个上下文中工作吗?抽象是否描绘了这两个概念?
>
通过接口和抽象类隐藏不必要的细节
IPet
接口,作为Dog
类的抽象。此外,我们可以提供一个Animal
基类作为抽象类,以提供更高级别的抽象。这可以让我们使用多态性,并允许属于我们的动物
抽象的不同类彼此交互
通过类API公开类来抽象类的实现
Dog
类,我们只需要知道它有一个feed()
函数作为其API的一部分,并调用该函数为其提供信息,而不知道实际是如何提供信息的。这提供了Dog
类的抽象,让我们可以轻松地与类交互我上面包含的一个链接包含Matthew Watson的以下引用:
“问题是这些概念没有精确的定义,即使在面向对象的上下文中,这些词本身也有多种含义。”
只是因为抽象是如此抽象,甚至定义也是抽象的:P?感谢您提前给予指导!
编辑:我对SO比较陌生,不知道“主要基于意见”的标志意味着什么。我看不出这个问题怎么会比一大堆关于抽象的问题更有效。我认为这会被认为是不太基于观点的,因为我实际上指出了两种不同的情况,我认为抽象在其中是有意义的。我看到很多问题只是问什么是抽象,我认为这是一个比我这里的问题更广泛的问题。
对我来说,抽象是指当你解决一个问题时,根本不涉及细节。如果您需要输出汽车列表,那么我不认为“获取汽车列表,浏览它们,获取它们的数据,打印它们”,而是认为“我需要一组对象,最好是汽车,它们可以以我需要的格式显示关于它们自己的数据。”。更多的是关于思维方式。
对我来说,抽象是oo最美丽的概念之一,这实际上是使程序语言非常接近人类思维的原因:我们人类总是想要分类。想想一辆车:你的车。让我们在一位银行家询问你在贷款中的资产的情况下探讨这辆车:你会说你有资产(最高抽象层次):一辆昂贵的汽车、一辆家用汽车、一栋房子、一艘船等等。它们都有特定的价值。然后,假设谈话的上下文切换到对那辆车有个人兴趣的银行家,因为他自己就是一个汽车迷。现在将对汽车进行更详细的描述,您可以看到定义了不同的抽象级别:具有品牌名称的跑车,以及更多的特性。
在设计期间,您的兴趣是关于抽象的层次:您想用它做什么,即它的上下文。因此,我们将有抽象的层次:资产、汽车(以及船和房子)、跑车、家庭汽车。等等上下文不应该有比它需要的更多的细节,这是您在设计阶段所关心的。
在实现阶段,您将通过封装属于这些级别的属性来实现这些抽象级别。例如,资产有一个价值,其中汽车有颜色,跑车可能有一些FamilyCar不具备的特定特征。
所以,关键的区别在于:设计时间和实现时间。
这篇博文详细描述了这种差异:http://javarevisited.blogspot.be/2017/04/difference-between-abstraction-and-encapsulation-in-java-oop.html
这里是stackoverflow的另一篇文章:抽象和封装之间的区别是什么?
希望这有帮助。
我在研究面向对象的概念,那里的抽象概念基本上被描述为对用户隐藏实现。所以,如果一个类中有一个成员函数,我们为某个任务调用该函数,抽象表示用户不应该关心事情是如何完成的,而应该只知道做了什么。但即使是在非面向对象编程风格中,如果我们编写一个函数,整个任务也只需调用一个函数即可完成。它不也遵循抽象逻辑吗?或者,OOP中的抽象和函数式编程之间有什么区别吗?
我正在阅读OOP的一些基本内容。我对封装和抽象感到困惑。根据我的理解,抽象是一种只暴露很少的东西而隐藏很少的东西的方式。封装帮助我们封装对象的状态,以便外部世界无法访问它,并且可以通过内部方法访问它。因此,它们都是相关的。但是我读过很多次,封装是通过使用getter和setter实现的,而抽象是通过使用抽象类和接口实现的。现在考虑下面的代码(C) 在上面的代码中,我没有使用接口或抽象类,但根据我的
让Person是一个具有属性name、age和idNumber的类。我希望有一个“人”的集合,我希望能够以最有效的方式执行以下操作: 通过他们的ID号检索他们。 获取年龄的人的列表 我的想法是同时维护一个使用id作为键的Hashmap和两个使用age和name作为每个树映射键的树映射。 这是最好的方式吗
我有两个类,它们具有相同的类名并使用相同的包名。但是,这两个类文件位于不同的目录中。这两个类之间的另一个不同之处是,每个类中都有其他类中没有的方法。本质上,我想将这些方法拆分为两个使用相同名称但不同文件夹的单独文件。 理论上,我认为这是可能的,因为Java编译器在构建输出时确实维护了目录结构。所以在运行时,如果在类中调用了一个方法,Java可能会在任何一个文件中找到该方法。 这可能吗?我使用的是I
当我宣布“抽象公共无效显示();”在抽象类测试中,这是创建一个全新的show()方法,还是只引用Inter接口中声明的show()方法?请澄清。