什么是抽象?

时间:2011-08-11 15:04:45

标签: abstraction

我看到流程中的抽象。 我看到数据的抽象。

我看到抽象正在失去不重要的细节。

我看到抽象是给一组元素一个名称并将它们视为一个单元。 (但我不知道为什么这被认为是抽象的。所以,我需要澄清这一点)

我知道也有抽象级别,虽然这个名字意味着什么,但我没有一个实际的例子,我想不出一个我对抽象定义感到困惑的具体问题。

有人可以写一篇全面的文章吗?抓一点。有人可以给出全面的答案吗?

编辑: - 谢谢您的回答。 但是,我一直在寻找一个普遍的答案。 例如,我正在阅读一篇文章,其中程序被视为抽象。 但是,这里的答案是关于C#和Java中的抽象类(到现在为止)。 再次感谢你。

4 个答案:

答案 0 :(得分:13)

抽象是隐藏实现的技术。在它的核心,没有更多的答案。抽象的大部分意义来自于它的使用方式和原因。

用于以下场景

  • 降低复杂性。 (创建一个简单的界面)
  • 允许修改实施而不影响其用户。
  • 创建一个支持多态的公共接口(将抽象层的所有实现都视为相同。
  • 强制用户扩展实施而不是修改。
  • 通过更改每个平台的实施来支持跨平台。

答案 1 :(得分:2)

抽象隐藏了特定实现的细节,并在实现之间共享公共细节。示例是java.util.List,java.util.ArrayList和java.util.Map。 List是父(抽象),ArrayList和Map是具体实现。

只要您在不同的类之间共享代码,就可以这样做,这样就不会重复您的代码,这是不好的。

抽象在代码重用,动态行为和标准化方面非常有用。例如,您正在使用一种方法,它接受一个List,因此要使用此方法,您可以发送任何以列表作为其父项的对象。现在在这个方法中,可能有不同的实现,具体取决于传递的对象的类型,因此您可以在运行时实现动态行为。在设计框架时,这是非常有用的技术。

答案 2 :(得分:2)

很简单,抽象是限制依赖关系的艺术。你依赖的越少,你就越抽象。例如,如果您编写DirectX渲染器,那么您将从正在运行的图形卡供应商和型号中抽象出来。如果您编写另一个图层,则可以与正在运行的操作系统隔离。

答案 3 :(得分:1)

我不确定你是否应该推荐书籍,如果是这样,请告诉我,我会删除我的帖子,但我喜欢Troelsen的Pro C#。抽象就像一个接口,但接口不允许你定义构造函数。这是为了概括。就像我有一个网格我想要显示一些用户字段。字段可以是文本,枚举,单值,多值。我使用抽象字符串属性DispValue构建了一个抽象类FieldDef。然后各种字段类型继承自FieldDef。在网格中我有简单的字符串来显示。然后,当用户更新字段属性时,将公开特定于字段类型的方法。另一个例子是所有哺乳动物都有共同的特征,但是当你向下钻取时,你会暴露出更多属性,但是对于所有哺乳动物都有一个单一的广义视图(界面),并且通过从哺乳动物遗传,有一种方法可以搜索并显示所有哺乳动物的共同属性。 。