基于C#的Windows应用程序开发实验与实践教程第1章Windows窗体第2章Windows常用控件的使用第3章创建控件第4章面向对象编程简介第5章使用ADO.NET访问数据第6章Windows程序中的调用第7章GDI+的简单编程第8章使用CrystalReports创建报表第9章提高程序的可访问性第4章面向对象编程简介第4章面向对象编程简介4.1对象和类4.2封装4.3继承4.4多态4.5接口4.6Windows程序中的面向对象4.7小结4.8习题4.1对象和类4.1.1对象4.1.2类4.1.3类成员4.1.4对象的创建和实例化4.1.5方法的参数对象和类对象是面向对象开发方法的基本成分,每个对象可用它本身的一组属性和其上的一组操作来定义。实际上,C#和.NETFramework中的所有东西都是对象。类是一组具有相同数据结构和相同操作的对象的集合。类是对一系列具有相同性质的对象的抽象,是对对象共同特征的描述。对象是具体的类,类和对象是面向对象编程的基础。对象和类【例4-1】定义一个Student类classStudent{privatestringname;publicstaticintstu_id;publicStudent(){name=zhangsan;}}【思考】如何创建Student类的对象类与对象的关系类成员类成员的访问修饰符有:public(公有的)、protected(保护的)和private(私有的)。public成员既可以在定义它的类中被访问,也可以在定义它的类外被访问;protected成员可以在定义它的类中被访问,也可以在继承类中被访问,不能在定义它的类外被访问;private成员只能在定义它的类中被访问,在定义它的类外不能被访问。例如:privatestringname;//私有成员,姓名类成员类的成员主要有以下几种:常量字段属性方法构造函数类成员——常量代表与类相关联的常量值例如:classA{publicconstintx=10;constdoublePI=3.14159;}类成员——字段类中的字段实际上是变量,因此字段的定义与变量的定义相同例如:classArea{publicintarea;}类成员——属性用于定义类中的值并对它们进行读写例如:publicclassPerson{privatestringp_name=abc;publicstringN{get{returnp_name;}set{p_name=value;}}}类成员——方法常称为函数,负责执行类中的计算和其它操作例如:classA1{publicstringDisplay(){returnhelloeveryone;}}类成员——构造函数一种特殊的方法,用于对类的实例进行初始化例如:classPoint{publicdoublex=0,y=0;publicPoint(){x=1;y=1;}publicPoint(doublea,doubleb){x=a;y=b;}}对象的创建和实例化(1)对象的声明格式为:类名对象名;例如:Pointp1;(2)对象实例化定义对象后,必须使用new运算符对其实例化,然后才能使用该对象。例如:p1=newPoint();(3)静态成员若将类中的某个成员声明为static,该成员称为静态成员。类中的成员要么是静态的要么是非静态的。静态成员由类访问;非静态成员由对象访问。方法的参数在C#中实参与形参有四种传递方式值参数引用参数输出参数参数数组值参数【例4-2】值参数传递。【例4-3】数组名作为参数传递。引用参数【例4-4】ref引用参数传递。使用ref参数的注意点:(1)ref关键字仅对跟在它后面的参数有效,而不能应用于整个参数表。(2)在调用方法时,也用ref修饰实参变量,因为是引用参数,所以要求实参与形参的数据类型必须完全匹配,而且实参必须是变量,不能是常量或表达式。(3)在方法外,ref参数必须在调用之前明确赋值,在方法内,ref参数被视为初始值已赋过。输出参数【例4-5】out引用参数传递。out和ref引用参数使用的区别在参数前加out修饰符的被称为输出参数,它与ref参数很相似,只有一点除外,就是它只能用于从方法中传出值,而不能从方法调用处接受实参数据。在方法内out参数被认为是未赋过值的,所以在方法结束之前应该对out参数赋值。参数数组【例4-6】params参数传递。注意事项4.2封装面向对象编程的一个原则是封装。封装是指对象的实现独立于它的接口。换句话说,应用程序通过对象的接口与对象交互,此接口由公共属性和方法组成。只要此接口维持不变,即使在不同版本中完全重载接口的实现,应用程序也能和组件进行交互。通过对实现细节的封装,就使得本身很复杂的问题变得非常简单,容易操作,并且出错的几率大大减小。对象应当只能通过它们的公共方法和属性与其他对象交互,因此,对象应当包含所有它需要的数据,并且应包含能用这些数据工作的全部功能;对象的内部数据应当永远不要在接口中公开,因此,字段的访问权限应当很少是public的。4.3继承继承是面向对象编程技术中最重要的特性之一,可以提高软件模块的可复用性和可扩充性,也可以提高软件的开发效率。C#中的对象仅能直接派生于一个基类,当然基类也可以有自己的基类。客观世界中的许多事物之间往往都是具有相同的特征,具有继承的特点。4.3继承【例4-7】使用类的继承4.3继承C#中的继承符合下列规则:1、继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类作为所有类的基类。2、派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。3、构造函数和析构函数不能被继承。除此以外的其他成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。4、类可以定义虚方法、虚属性等。它的派生类能够重载这些成员,从而实现类可以展示出多态性。4.4多态继承的一个结果是派生于基类的类在方法和属性上有一定的重叠,因此,可以使用相同的语法处理从同一个基类实例化的对象。多态性则推进了一步。可以把某个基本类型的变量赋于其派生类型的变量,不需要进行强制类型转换,就可以通过这个变量调用基类的方法。多态是不同的类对相同的公共接口提供不同实现的能力。换句话说,多态允许调用对象的方法和属性而不用考虑这些属性和方法的具体实现。虚方法的重载虚函数:当类中的方法声明前加上了virtual修饰符,称之为虚方法。使用了virtual修饰符后不允许再有static,abstract,或override修饰符。重载:在派生类中重新定义此虚函数时,要求的是方法名称、返回值类型、参数表中的参数个数、类型顺序都必须与基类中的虚函数完全一致。在派生类中声明对虚方法的重载要求在声明中加上override关键字,而且不能有new,static或virtual修饰符。虚方法的重载【例4-8】虚方法的重载。抽象类与抽象方法抽象类是一种特殊的基类,并不与具体的事物联系。抽象类的定义使用关键字abstract。需要注意的是,抽象类不能被实例化,它只能作为其它类的基类。【例4-9】抽象类与抽象方法。4.5接口一个接口的定义相当于一个约定。实现某接口的类或结构必须遵循该接口定义的约定。一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。接口包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现,仅指定实现该接口的类或结构所必须提供的成员。4.5接口接口声明——接口声明就是新的接口的类型声明例如:publicinterfaceIDrivable{接口体}接口的名字习惯上用大写字母I开始,跟在I后的第一个字符也是大写的4.5接口接口继承与类继承的差异:1)类继承不仅是声明继承,也是实现继承;而接口仅是声明继承。2)派生类可以继承基类方法的实现,而派生类接口只继承了父接口的成员方法声明,而没有继承父接口的实现。3)类继承只允许单继承,而接口继承允许多继承。4)一个子接口可以有多个父接口,而一个类只能有一个父类。4.5接口【例4-10】接口继承的使用接口的继承和使用类继承接口和类接口继承接口4.5接口类和接口的比较描述具体类抽象类接口能否实例化不能不能不能能否多继承不能不能能能否为方法提供代码能能不能能继承哪些类型具体类、抽象类和接口具体类、抽象类和接口接口能包含哪些成员常量、字段、方法、属性、索引函数、事件、运算符常量、字段、方法、属性、抽象函数方法、索引函数和事件4.6Windows程序中的面向对象【例4-15】对象的使用4.7小结本章介绍了面向对象的基本概念,包括类、对象,封装、继承和多态等,以及WindowsForms应用程序与面向对象编程的关系。4.8习题1.创建一个Person类,包括一个年龄字段,一个姓名字段,一个输出字段值的方法。创建两个Person类的实例,编译测试Person类。2.重建Person类,在题1的基础上增加两个读写字段的属性,创建两个对象,编译测试Person类。3.在题2的基础上,增加一个带有两个参数的构造函数,同时,创建两个对象,编译并测试Person类。4.接口声明主要由几部分组成,各部分的作用是什么?5.C#中接口和类的区别是什么?