第9章 类
瓦茨S.汉弗莱[1]曾经说过“软件开发的历史就是软件规模逐渐变大的历史”,在软硬件环境逐渐复杂的情况下,软件如何得到良好的维护?面向对象程序设计在某种程度上通过强调可重复性解决了这一问题。20世纪70年代的Smalltalk语言在面向对象方面堪称经典——以至于40年后的今天,我们依然将这一语言视为面向对象语言的基础。
传统的程序设计将程序看做一系列函数的集合,而面向对象程序设计中的基本单元为对象,每一个对象都可以接收数据、处理数据并将数据传送给其他对象,每个对象都是责任和数据的结合体。
C#就是一种面向对象的语言,其他还包括大家熟悉的Java、C++等。面向对象的语言具有一些基础理论,或者叫做基本特征,它们是类、对象、方法、消息传递机制、继承性、封装性、多态性、抽象性。
本章将要学习其中最核心的概念之一:类。学习一门语言时,熟悉语法是基本的要求,更进一步则是学习其中的编程思想,C#语言本身也是语言开发者思想的载体,或者是一种思想表达。我们在本书中也会适时为读者补充一些相关的知识介绍,如果要更深入地学习,望大家能够自行阅读面向对象编程方面的相关书籍,以更好地使用C#这个工具。
阅读本书就像漫步在知识的沙滩上,希望大家偶尔能够捡到几只漂亮的贝壳。
9.1 类是什么
我们以ATM取款机软件为例来说明类的稳定性。一开始,用户希望ATM支持本行银行卡,然后又想支持银联银行卡,再往后可能又想支持跨行、跨国账户结转,等等。这说明软件的功能最易发生变化,数据次之。我们将功能和数据分别比做鸡蛋的蛋清和蛋黄,它们本身是不稳定的,如果没有一个容器,你很难将它们一起拿走,但是如果将它们放到一个蛋壳里面,作为一个完整的鸡蛋的话,整体就是稳定的,如图9-1所示。
图 9-1 上升到面向对象是必然结果
这个整体就是一个对象,数据就是对象的属性、字段,而功能就是对象的函数成员,它可以提供数据运算。这个对象映射到计算机语言中,就是类。还拿鸡蛋做例子,鸡蛋是类,但是鸡蛋在这里只是一个概念,它表示所有鸡蛋,如果我们要吃鸡蛋,或者拿鸡蛋炒西红柿的话,这时都是某个具体鸡蛋,这些鸡蛋就是类的实例,或者说类具体化了。
可以说,类描述了它所代表对象的共同属性和行为。因此,一个类最基本的两个组成部分是数据和行为(功能)。
其中,数据包含字段(Field)和属性(Property),用于保存与该类有关的信息变量;而行为则是功能、动作,表示类所能提供的服务。
[1]瓦茨S.汉弗莱(Watts S.Humphrey),在软件工程领域享有盛誉,被美国国防软件工程杂志CrossTalk评为近几百年来影响软件发展的十位大师之一。