1.3.2 抽象的概念
面向对象编程的一个实质性的要素是抽象。人们通过抽象(Abstraction)处理复杂性。
例如,人们不会把一辆汽车想象成由上万个相互独立的部分所组成的一个设备,而是把汽车想象成一个具有自己独特行为和整体功能的事物。人们可以忽略引擎、传动及刹车系统的工作细节,而将汽车作为一个整体加以利用。
面向对象的程序设计在此基础上则跨出了一大步,程序员可利用一些工具表达问题空间内的元素。由于这种表达非常普遍,所以不必受限于特定类型的问题。我们将问题空间中的元素以及它们在方案空间的表示物称做“对象”(Object)。当然,还有一些在问题空间没有对应体的其他对象。通过添加新的对象类型,程序可进行灵活的调整,以便与特定的问题配合。
另外,使用层级分类是管理抽象的一个很有效的方法,它允许人们根据物理意义将复杂的系统分解为更多更易处理的模块。从表面看,汽车是一个独立的对象,一旦到了内部,就会发现汽车由若干个子系统组成,例如驾驶系统、音响系统、安全系统、制动系统等等。再进一步细分,这些子系统由更多更详细的专用元件构成。例如,音响系统由收音机、CD播放器等组成。从这里得到的启发是,可以通过层级抽象对复杂的汽车(或任何另外复杂的系统)进行管理。
复杂系统的分层抽象也被应用于计算机程序设计中。传统的面向过程程序的数据经过抽象可用若干个对象表示,程序中的过程步骤可看成是在这些对象之间进行消息收集。每一个对象都有它自己的独特行为特征。人们可以把这些对象当做具体的实体,让它们控制消息做出反应,这就是面向对象编程的本质。面向对象的概念是C#的核心,对于程序员来说,重要的是要理解这些概念怎么转化为程序。在任何重要的软件项目中,软件都不可避免地要经历概念提出、成长、衰老这样一个生命周期,而面向对象的程序设计,可以使软件在生命周期的每一个阶段都有足够的应变能力。例如,一旦定义好了对象和指向这些对象的简明的、可靠的接口,人们就能从容、自信地解除或更替旧系统的某些组成部分。
通常来说,对实体的抽象分为两部分:对属性的抽象和对行为的抽象。被抽象出来的属性在程序设计语言中通常被称为成员变量(Variable Member)或者字段(Field),被抽象出来的行为在程序设计语言中通常被称为方法(Method)。