第八章 面向对象编程简介
本章内容:
● 什么是面向对象编程
● OOP技术
● Windows Forms应用程序对OOP的依赖关系
8.1 面向对象编程的含义
前面介绍的编程方法称为函数(或过程)化编程,常常会导致所谓的单一应用程序,即所有的功能都包含在几个代码模块中(常常是一个代码模块)。 而使用OOP技术,常常要使用许多代码模块,每个模块都提供特定的功能,每个模块都是孤立的,甚至与其他模块完全独立。这种模块化编程方法提供了非常大的多样性,大大增加了重用代码的机会。
OOP技术以结构、数据的含义以及数据和数据之间的交互操作为基础。这通常意味着要把更多的精力放在项目的设计阶段,但项目的可扩展性比较高。
除了数据表达方式的一致性外,OOP编程还常常可以简化任务,因为较抽象实体的结构和用法也是一致的。
8.1.1 对象的含义
简单地说,对象非常类似于本书前面讨论的结构类型,包含变量成员和函数类型。它所包含的变量组成了存储在对象中的数据,其中包含的函数可以访问对象的功能。略为复杂的对象可能不包含任何数据,而只包含函数,表示一个过程。
C#中的对象是从类型中创建的,就像前面的变量一样。对象的类型在 OOP 中有一个特殊的名称:类。可以使用类的定义实例化对象,这表示创建该类的一个实例。“类的实例”和对象含义相同,注意“类”和“对象”是完全不同的概念(例如:类型:汽车;实例:路虎,奥迪a6,宝马x5等)。
本章将使用统一建模语言(Unified Modeling Language,UML)语法研究类和对象。UML是为应用程序建模而设计的,从组成应用程序的对象,到它们执行的操作,到我们希望有的用例,应有尽有。
图8-1是打印机类Printer的UML表示方法。类名显示在这个框的顶部(后面将论述下面两个区域)。
图8-2是这个Printer类的一个实例myPrinter。
在顶部,实例名显示在前面,后面是类名。这两个名称用一个冒号分隔。
1. 属性和字段
可以通过属性和字段访问对象中包含的数据。这个对象数据可以用于区分不同的对象,因为同一个类的不同对象在属性和字段中存储了不同的值(比如,每个人都是对象,都有属性:眼睛度数。每个人的眼睛度数是不一样的,但人都是同一个类型。也就是每个对象是独立的。(静态数据除外))。
含在对象中的不同数据构成了对象的状态。假定一个对象类表示一杯咖啡,叫作CupOfCoffee。在实例化这个类(即创建这个类的对象)时,必须提供对类有意义的状态。此时可以使用属性和字段,让代码能通过该对象设置要使用的咖啡品牌,咖啡中是否加牛奶或方糖,咖啡是否即溶等。于是,给定的这杯咖啡对象就有了指定的状态,例如,加牛奶和两块方糖的哥伦比亚滴滤咖啡。
字段和属性都可以键入,所以可以把信息存储在字段和属性中,作为string值、int值等。但是,属性与字段是不同的,因为属性不提供对数据的直接访问。对象能让用户不考虑数据的细节,不需要在属性中用一对一的方式表示。
一般情况下,在访问状态时最好提供属性,而不是字段,因为这样可以更好地控制各种行为,这个选择不会影响使用对象实例的代码,因为使用属性和字段的语法是相同的。
对属性的读写访问也可以由对象来明确定义。某些属性是只读的,只能查看它们的值,而不能改变它们(至少不能直接改变)。还可以有只写的属性,其操作方式是类似的。
还可以为字段和属性指定另一种访问权限,称为可访问性。这种可
访问性确定了什么代码可以访问这些成员,它们是可用于所有的代码(公共),还是只能用于类中的代码(私有),或者更复杂的模式(详见本章后面的内容)。常见的情况是把字段设置为私有,通过公共属性访问它们(这样外部只能通过公共方法修改对象的数值,避免传入无效数值)。
在类的UML表示方法中,用第二部分显示属性和字段,如图8-3所示。
每个成员都包含下述信息:
可访问性,+号表示公共成员,-号表示私有成员。但一般情况下,本章的图中不显示私有成员,因为这些信息是类内部的信息。至于读/写访问,则不提供任何信息。
成员名。
成员的类型。
冒号用于分隔成员名和类型。