我试图理解称为 abstraction 的基本OOP概念。当我说"理解"时,我的意思不仅仅是学习一个定义,而是真正有深刻的理解。
在互联网上,我看到了许多定义,例如:
隐藏低级别实施并提供高级别规范
和
专注于基本素质,而不是具体的例子。
据我所知,iPhone按钮是一个很好的抽象示例,因为作为用户,我不必知道屏幕的显示方式,我只需要按下按钮。
当谈到抽象时,您如何看待以下结论:
抽象需要许多特定的对象实例,并通过提供单一的通用概念来提取它们的共同信息和功能。
基于此,一个类实际上是许多实例的抽象,对吧?
答案 0 :(得分:2)
我不同意你的两个例子。 iPhone按钮不是屏幕的抽象,它是使用手机的界面。类也不是其实例的抽象。
抽象可以被认为是将特定概念视为更一般概念的形式。
重复过度使用的例子:所有车辆都可以移动。汽车转动轮子,飞机使用喷气式飞机,火车在轨道上运行。
考虑到车辆的集合,而不是知道每辆车的具体情况。内部运作,并且必须:
car.RotateWheel();
airplane.StartJet();
train.MoveOnTrack();
我们可以将这些对象视为更抽象的vehicle
,并告诉他们
vehicle.Move();
在这种情况下,vehicle
是抽象。它不代表任何特定的对象,但代表了汽车,飞机和火车的共同功能,并允许我们与这些特定对象进行交互,而不了解它们,除了它们是vehicle
的类型。
在OOP的上下文中,vehicle
很可能是更具体类型的车辆的基类。
答案 1 :(得分:1)
恕我直言,实际上有两个基本概念需要在这里理解。
抽象:只处理"什么"而不是"如何"东西。例如:当您调用对象方法时,您只关心该方法的作用,而不关心它是如何做的。有抽象层,即上层只对下层的内容感兴趣,而不是它如何做。另一个例子:当您编写汇编指令时,您只关心特定指令的作用,而不关心CPU中的底层电路如何执行指令。
概括:比较一堆东西(对象,函数,基本上任何东西)的想法,并找出它们之间的共性,然后提取这种共性。具有一堆属性的类是类实例的泛化,因为所有实例具有相同的属性,但这些属性的值不同。
答案 2 :(得分:0)
面向对象编程的目标是尽可能地将现实世界的思维融入软件开发中。也就是说,抽象表示任何字典可以定义的内容。
例如,抽象 in Oxford Dictionary的可能定义之一:
处理想法而不是事件的质量。
WordReference.com's definition更有说服力:
除了具体的现实,特定的对象或实际情况之外,将某事视为一般品质或特征的行为。
事实上,WordReference.com的一个是抽象的可能定义之一,你应该感到惊讶,因为它不是抽象的编程解释
也许你想要一个更符合编程的抽象定义,我会尝试提供一个很好的总结:
抽象是将具体现实转化为可用作原型的对象表示的过程。通常,在大多数OOP语言中,原型由类型表示,而类型又可以由类,结构和接口定义。类型可以抽象数据或行为。
抽象的一个很好的例子是用橡木制成的椅子仍然是椅子。这就是我们思维方式的运作方式。您了解到某些形式是许多事物的最基本定义。你的大脑没有看到给定椅子的所有细节,但它发现它满足了考虑椅子的要求。面向对象的编程和抽象只是反映了这一点。