欢迎来到对象的世界!

在你目前的编程旅程中,你可能主要集中于过程式编程(procedural programming)——即编写一系列让计算机逐步执行的指令。但随着程序变得越来越庞大,它们可能会变得像一团混乱的“意大利面条代码”(spaghetti code)——既混乱又难以调试!

在本章中,我们将探讨面向对象编程(Object-Oriented Programming, OOP)。这是一种不同的“范式”(思考模式),我们围绕着对象(objects)——例如用户、汽车或游戏角色等现实世界的事物——来组织代码,而不是仅仅关注动作。这使得代码更容易重用、组织和维护。如果起初觉得有点抽象,别担心,我们会一步一步为你拆解!

3.9.1 类、对象与实例化

什么是类和对象?

理解类(class)对象(object)之间区别的最简单方法,就是将它们想象成“蓝图”和“房屋”。

是一个蓝图或模板。它定义了某个事物看起来是什么样子,以及它能做什么,但它本身并不是该事物。

对象则是根据该蓝图建造出来的实际成品。它是类的一个特定“实例”(instance)。

例子:想象一个“饼干模具”(类)和“饼干”(对象)。模具定义了形状,但饼干才是你真正能吃到的东西!

属性与方法

在类内部,我们定义了两个主要部分:

1. 属性(Properties 或 Attributes): 这些是对象关于自身的各种数据。你可以把它们想象成“名词”。
2. 方法(Methods): 这些是对象可以执行的函数或动作。你可以把它们想象成“动词”。

类比:如果我们有一个名为“狗”(Dog)的
属性名字(name)、品种(breed)、颜色(color)、年龄(age)。
方法吠叫(bark)、进食(eat)、睡觉(sleep)。

实例化

实例化(Instantiation)只是一个描述“创建对象”的专业词汇。当你编写代码来制作类的一个新版本时,你就是在实例化它。

快速回顾:
类 (Class): 蓝图/模板。
对象 (Object): 从模板创建出来的特定事物。
属性 (Property): 存储在对象中的数据(例如:颜色)。
方法 (Method): 对象可以执行的动作(例如:移动)。
实例化 (Instantiation): 制作该对象的过程。


OOP 的核心概念

封装 (Encapsulation)

封装是指将数据(属性)和方法捆绑在一起形成一个单元(类),并向外界“隐藏”其内部运作方式的理念。这通常被称为“数据隐藏”。

为什么要这样做? 它可以防止程序的其他部分意外地以错误的方式修改对象的数据。

类比:电视遥控器。你知道按下哪些按钮(接口),但不需要看到内部的电线和电路(封装)就能让它运作。

继承 (Inheritance)

继承允许一个类取得另一个类的属性和方法。我们将原始类称为父类(parent class)或超类,而新的类称为子类(child class)或次类。

这非常有用,因为它让我们免于反复编写相同的代码!

例子:“车辆”(Vehicle)类可能具有“速度”和“燃料”等属性。“汽车”(Car)类可以从“车辆”继承,因为汽车“是一种”(IS-A)车辆。它会自动获得“速度”和“燃料”,然后你可以再添加汽车专用的属性,例如“车门数量”。

覆写 (Overriding)

有时候,子类想以不同的方式执行某个操作。覆写是指子类为父类中已经定义的方法提供自己的版本。

例子:“鸟类”(Bird)父类可能有一个名为 fly() 的方法。“企鹅”(Penguin)子类继承自 Bird,但因为企鹅不会飞,你可以覆写 fly() 方法,使其显示为“我改为游泳!”

关联 (Association)

关联描述了两个不同类之间的关系,其中一个类“使用”或“拥有”另一个类,但它们并不一定是父子关系。这就是对象之间如何对话的方式。

例子:“教师”(Teacher)类和“学生”(Student)类。它们之间存在关联,因为教师教导学生,但教师并不是学生的一种(所以这不是继承)。

你知道吗?
大多数现代软件,从你手机上的应用程序到大型银行系统,都是使用这些 OOP 原则构建的。因为这让多名程序员能够同时处理不同的“对象”,而不会干扰彼此的代码,极大地提高了开发效率!


常见误区

1. 混淆类与对象: 记住,你无法“驾驶”汽车的蓝图。你必须实例化该类,才能得到一个真正可以使用的对象。
2. 忘记封装: 初学者经常将所有属性设为“公开”(public,意味着任何东西都能修改它们)。尝试将数据保持为私有(private),并使用方法来安全地修改数据。
3. 过度使用继承: 只有在存在“是一种”(IS-A)关系时才使用继承(例如:狗“是一种”动物)。不要仅仅为了节省打字而使用它!


重点总结

• 为何使用 OOP? 为了更好地组织、重用和维护大型程序。
• 类 vs 对象: 类是模板;对象是特定的实例。
• 封装: 将数据安全地隐藏在对象内部。
• 继承: 将特征从父类传递给子类。
• 覆写: 修改父类的方法以符合子类的特定需求。
• 关联: 不同的对象如何相互联系或互动。

如果起初觉得有点棘手,别担心!只要你在编码中多加练习创建自己的类和对象,这些概念就会逐渐变得像本能一样。你可以做到的!