2.1 面向对象编程的基本概念
面向对象编程(ООП)是一种编程方法,其中程序中的所有实体都被视为对象。对象是数据+方法/函数,这些方法处理这些数据。
我们也可以说对象有状态和行为。对象的状态由其内部变量存储的数据提供。对象的行为是其方法执行的所有操作的集合。
在中型程序中有成千上万个对象,而在大型程序中则有数百万个对象。为了减少混乱,人们决定将对象组织成类,并将类组织成某种层次结构。
每个对象都有一个类,通过它来创建对象。类一方面是对象的模板,另一方面它是具有自己特点的独立对象(将在下面讨论)。
为了更好地理解类的概念,请阅读以下定义:
类是创建对象的模板或方案,定义了该类型所有对象的属性和方法。类可以将数据和与数据相关的函数组织在一起。
对象是类的实例。每个对象都有状态(由属性定义)和行为(由方法定义)。
封装是隐藏类的内部实现并提供一个接口与这些对象交互。这有助于保护数据并管理对数据的访问。
继承允许一个类(子类)继承另一个类(父类)的属性和方法。这有助于代码的重用和简化其维护。
多态性允许使用统一的接口与不同类的对象进行交互。这通过在子类中重写从父类继承的方法来实现。
抽象是提取对象的共同特征并创建表示这些共同特征的类。这有助于简化复杂系统并提高其可理解性。
如果你至少理解了一半,那就太好了。接下来我们将更详细地讨论这些要点。
2.2 抽象
在现实生活中,一个好的抽象例子是公司或组织中的职位描述。职位的名称是一回事,而每个职位的职责是完全不同的。
想象一下,你正在设计你未来公司的结构。你可以把秘书的职责拆分给几个不同的职位。可以将首席执行官的职位分解为几个独立的职位:财务总监、技术总监、市场总监、人力资源总监。或者,您可以将办公经理和招聘人员的职位合并为一个。
从编程的角度来看,抽象是一种正确的划分程序为对象的方式。通常,任何大型程序都可以通过几十种方法表示为相互作用的对象。 抽象允许选择主要特征并忽略次要特征。
抽象就像军事策略。坏策略就算有优秀的战术也无法拯救局面。
2.3 封装
封装的目标是通过简化事物来改善事物之间的相互作用。
最好的简化方法是隐藏复杂的东西。例如,如果你被放在波音飞机的驾驶舱里,你不会马上知道如何驾驶它:
另一方面,对于飞机上的乘客来说,一切看起来很简单:买票,坐飞机,起飞和降落。即使只具备“买票”和“坐飞机”的技能,也可以轻松从一个大陆飞到另一个大陆。所有准备飞机起飞、起飞、降落和各种紧急情况的复杂性都被隐藏了。更不用说卫星导航、自动驾驶仪和机场调度中心。这让我们的生活更简单。
从编程的角度来看,封装是“隐藏实现”。我喜欢这样的定义。我们的类可以包含上百种方法,并在各种情况下实现非常复杂的行为。但我们可以将该类的所有方法隐藏起来(在其名称两侧加上"__"),而仅用于与其他类进行交互的方法只保留几对三种。那么我们程序中的所有其他类将仅能看到该类的这三个方法,并仅调用它们。所有复杂性都将被隐藏在类内,就像飞行员的驾驶舱与快乐的乘客一样。
2.4 继承
继承有两个方面:编程方面和现实生活方面。从编程的角度来看,继承是两个类之间的特殊关系。但更加有趣的是,继承在现实生活中是什么。
如果我们需要在现实生活中创造某样东西,我们有两个解决方案:
- 从头开始创建我们需要的东西,费很多时间和精力;
- 基于现有的东西创建我们需要的东西。
最佳策略如下:采用现有的好方案,稍作改进,使其适合自己的需要并使用它。
如果我们追溯人类的起源,会发现自地球上生命出现以来已经过去了数十亿年。而如果设想人类是从猿类(基于猿类)产生的,那么仅仅几百万年过去了。从头开始创造时间更长。要长得多。
在编程中也可以基于另一个类创建一个类。新类成为现有类的子类(继承)。当有一个类包含80%-90%我们所需的数据和方法时,这是非常有利的。我们只需将合适的类声明为我们新类的父类,那么新类将自动继承父类的所有数据和方法。是不是很方便?
2.5 多态性
多态性是一个编程领域的概念。它描述了一种情况,其中多个实现隐藏在同一接口后面。如果试图在现实生活中寻找它的类似物,那么其中之一就是驾驶汽车的过程。
如果一个人可以驾驶卡车,他也可以驾驶救护车和跑车。一个人可以驾驶汽车而不管那是什么车,因为它们都有相同的操作接口:方向盘、踏板和变速杆。汽车的内部结构不同,但它们都有相同的操作接口。
回到编程中,多态性允许对不同类(通常有共同祖先)的对象进行统一操作,这一点难以高估。它的价值随着程序规模的增加而增加。
ООП是一种原则。内部规律。每个原则在某种程度上限制我们,但当程序规模增大时,它们提供了巨大的优势。四个ООП原则就像椅子的四条腿。即使只去掉其中一条腿,整个系统就会变得不稳定。
GO TO FULL VERSION