C#面向对象编程
面向对象编程技术中*重要的概念就是类和对象。类(class)表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。简单地说,类是一种抽象的数据类型,是对一类对象的统一描述。类是对某个对象的定义,它包含有关对象动作方式的信息,包括名称、方法、属性和事件。类本身不是对象,因为它不存在于内存中。
面向对象的程序设计具有3个特征:封装、继承和多态。可以大大地增加程序的可靠性、代码的可重用性和程序的维护性。
封装:将抽象得到的数据和行为(或功能)形成一个有机的整体,即将数据与操作数据的源代码进行有机地结合,形成“类”,其中数据和函数都是类的成员。
继承:通过继承可以创建父类和子类(派生类)之间的层次关系。子类可以使用现有类的所有功能(实现“代码重用”),并对现有的类的功能进行扩展。通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”“父类”或“超类”。派生的新类既有基类的特点,又有其本身的新特征。
多态是指不同的类进行同一操作可以有不同的方法。实现多态,有两种方式:覆盖和重载。
覆盖:是指子类重新定义父类的虚函数的做法。
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
3.1 类与对象
C#的类是一种对包括数据成员、函数成员和嵌套类型进行封装的数据结构。其中数据成员可以是常量。函数成员可以是方法、属性、索引器、事件、操作符、实例构建器、静态构建器、析构器。
类是面向对象的程序设计的核心,实际上是一种新的数据类型。
3.1.1 类的结构与定义
类的定义一般分为声明部分和实现部分。声明部分用于声明该类的成员,包括数据成员、成员函数的声明。成员函数用于对数据进行操作,又称之为“方法”。实现部分用于成员函数的定义。
类声明的一般格式如下:
[类访问修饰符] class类名称:[基类名称]
{
类体
}
【说明】 被方括号括起来的选项为可选项。
(1)类访问修饰符,可选项,用于定义类及其成员的可访问性,包括以下内容。
① public:公共的,表示可以被任意访问,访问不受限制。
② private:只可以被本类所访问。
③ protected:表示受保护的,只能被本类和其继承的子类访问。
④ internal:只限于此程序(类所在的程序内,即同一个编译单元:.DLL或.EXE)访问。
⑤ abstract:抽象类,不允许建立类的实例。
⑥ sealed:密封类,不允许该类被继承。
声明每一个类时,如果省略了访问修饰符,则默认的访问权限为internal。
(2)关键字class,表示类的定义,只能是小写字母。
(3)类名称,是C#中的一个合法的标识符。由用户指定,只要满足命名规则即可;基类名称,可选项,用于声明要继承的类或接口。
(4)类体,用大括号({})括起来,称之为类的主体。其中,一般包含两类成员:数据成员和成员函数。数据成员的数据类型可以是任意合法的数据类型,也可以是另外一个类的对象。例如,例2.47中的类Student的定义。
3.1.2 对象的定义
类是对同类对象的一种抽象,对象是类的实例。一个类定义之后,就可以定义该类的对象。对象是具有数据、行为、标识的编程结构,是面向对象应用程序的一个组成部分。这个组成部分封装了部分应用程序。该应用程序可以是一个过程、数据或一些抽象的实体。
1.对象的定义
类的对象声明与创建格式如下:
类名 对象名; //类的声明未实例化
类名 对象名 = new类名称([参数表]); //类的声明并实例化对象
2.对象的使用(成员的引用)
类的对象,通过运算符“.”引用类的成员。格式如下:
类名.成员名称
当然类的成员能否允许访问要受成员的访问修饰符的控制。在使用“对象名.成员名”来访问对象成员时,一定要确认该对象引用不能为空(null),否则会引起异常。例如:
Student st; //参见例2.47中的类Student的定义,声明了类的对象,未实例化
st.sName = "赵颖";//将引发错误,因为st对象为null。st未实例化,即未指向任何存储空间
类和对象既有区别也有联系。类是一个相对抽象的概念,对象是一个具体的概念。类为对象的生成提供模板,利用new生成类的一个对象。
3.2 类的成员
定义在类体中的元素都是类的成员。类的成员分为数据成员(描述状态)和函数成员(描述操作)。类的成员要么是静态(static)成员,要么是实例(instance)成员。静态成员可以通过类名称直接引用,实例成员要通过类的实例(对象)引用。类中一些常用的成员如下。
(1)常量:与类关联的常量值,包括常成员函数和常数据成员。
(2)字段:类中定义的变量。
(3)方法:类可执行的计算或操作,主要是函数(方法)。
(4)属性:定义一些特性以及与读写这些特性相关的操作。
(5)事件:可由类生成的通知。
(6)索引器:能以数组方式索引类的实例的操作。
(7)运算符:类所支持的运算符。
(8)委托:本质也是类,可以引用一个或多个方法。
(9)构造函数:特殊的成员函数,初始化类的实例或类本身所需要的操作,名称与类名相同。
(10)析构函数:特殊的成员函数,在撤销类实例之前执行的操作。
(11)嵌套类型:在类中声明的类型。