OOP 基础知识:抽象
在日常生活中,我们经常使用概括性概念来表达信息的要点,而不需要纠缠细节。例如,在回答“你是怎么到这里来的”这个问题时,一个人可以直接说“开车来的”。这样一来,大家都会明白,我们所说的车有四个轮子、带发动机和供乘客乘坐的车身结构。汽车的具体品牌、颜色或生产年份对我们来说并不重要。
在使用程序时,只要程序能正确执行任务,用户也并不真正关心程序内部采用的是哪种算法。例如,可以使用十几种不同的方法对列表排序。
因此,抽象意味着提供一个简单的编程接口,隐藏所有复杂的实现细节。
编程接口是在类的上下文中定义的一组函数,根据对象的用途执行一系列操作。除了这些接口函数外,可能还有一些更小的辅助函数,但只能在类内部使用。与结构体类似,类的所有函数都有一个特殊的名称,称为方法。
实现通常使用属于对象的变量或数组(根据类描述)来存储信息。这些变量或数组称为“字段”(这一术语来源于这样一个事实,即对象属性通常与用户界面中的输入字段或数据库中的字段以 1:1 的关系相关联,对象的当前状态会保存在这些字段中,以便下次启动程序时能够恢复)。
字段和方法虽然是在类中描述的,但都与特定对象相关:每个实例都会分配一组自己的变量,它们的值与其他对象的状态无关,而方法则与其实例的字段搭配使用。
接口与实现必须相互独立。如果需要,一种实现方法应该很容易被另一种替换,而不会对编程接口产生任何影响。根据特定任务的需求来设计接口至关重要,而不是为了迎合特定的实现方式而定制接口。类的开发者需要能够从两种不同的视角审视自己创建的类:1) 作为内部算法和数据结构体的编写者;2) 作为潜在的挑剔客户,他们会将这个类看作一个“黑箱”,而接口就是这个“黑箱”的控制面板。推荐的做法是,在开始开发一个类时,首先考虑其编程接口的设计,然后再去寻找和选择具体的实现方法。