面向对象程序设计优秀课件.ppt
面向对象程序设计面向对象程序设计第1页,本讲稿共73页 面向对象程序设计简介面向对象程序设计简介3.1 继承、多态与接口继承、多态与接口3.2 接接 口口 3.3第2页,本讲稿共73页 3.1 3.1 面向对象程序设计简介面向对象程序设计简介 3.1.1 面向对象的基本概念面向对象的基本概念第3页,本讲稿共73页抽象抽象 软件开发使用的抽象主要有两类:过程抽象和数据抽软件开发使用的抽象主要有两类:过程抽象和数据抽象。象。过程抽象将整个系统的功能划分为若干部分过程抽象将整个系统的功能划分为若干部分数据抽象把系统中需要处理的数据和对这些数据的操作结数据抽象把系统中需要处理的数据和对这些数据的操作结合在一起合在一起第4页,本讲稿共73页封装封装 2.目的:封装的主要目的是达到接口和实现的分离。目的:封装的主要目的是达到接口和实现的分离。1.定义:定义:封装是指使用抽象数据类型将数据和基于数据封装是指使用抽象数据类型将数据和基于数据的操作包装在一起。的操作包装在一起。封装:封装:第5页,本讲稿共73页类与对象类与对象 1对象(对象(object)对象指的是一个实体的实例,在这个实体中包括了特定的属性数据对象指的是一个实体的实例,在这个实体中包括了特定的属性数据和对这些数据进行操作的方法。和对这些数据进行操作的方法。2类(类(class)类是一组具有相同数据结构和相同操作的对象的集合。类是一组具有相同数据结构和相同操作的对象的集合。在一个类中,每个对象都是类的实例,可以使用类中提供的方法。在一个类中,每个对象都是类的实例,可以使用类中提供的方法。创建类的对象的操作,被称为类的实例化创建类的对象的操作,被称为类的实例化第6页,本讲稿共73页 3.1.2 类的定义类的定义 1类的定义类的定义 类的定义用关键字类的定义用关键字class来说明,完整来说明,完整的类定义的格式如下:的类定义的格式如下:第7页,本讲稿共73页 类修饰符类修饰符 class 类名类名:基类名基类名 /类的成员定义类的成员定义第8页,本讲稿共73页 2类的修饰符类的修饰符 类的修饰符用于设置类的访问权限,类的修饰符用于设置类的访问权限,即对类进行封装。类的修饰符可以是以下即对类进行封装。类的修饰符可以是以下几种之一或者是它们的组合,在类的定义几种之一或者是它们的组合,在类的定义中,同一修饰符不允许出现多次。中,同一修饰符不允许出现多次。第9页,本讲稿共73页 internal:表示受内部的,只有其所在:表示受内部的,只有其所在同一程序集的文件中才能访问。同一程序集的文件中才能访问。public:表示公有的,对该类的访问:表示公有的,对该类的访问不会受到限制。不会受到限制。第10页,本讲稿共73页 protected:表示受保护的,只能从所:表示受保护的,只能从所在类和所在类派生的子类进行访问。在类和所在类派生的子类进行访问。private:表示私有的,私有访问是允:表示私有的,私有访问是允许的最低访问级别许的最低访问级别,私有成员只有在声明它私有成员只有在声明它们的类中才是可访问的。们的类中才是可访问的。第11页,本讲稿共73页 new:仅允许在嵌套类声明时,使用:仅允许在嵌套类声明时,使用该修饰符表明类中隐藏了由基类中继承而该修饰符表明类中隐藏了由基类中继承而来的、与基类中同名的成员。来的、与基类中同名的成员。partial:在整个同一程序集中定义分:在整个同一程序集中定义分部类和结构。部类和结构。第12页,本讲稿共73页 abstract:表示该类为抽象类,不允许:表示该类为抽象类,不允许为该类建立类的实例。为该类建立类的实例。sealed:表示该类为密封类,不允许被:表示该类为密封类,不允许被继承。继承。第13页,本讲稿共73页 3类的实例类的实例 使用使用new 关键字可以建立类的实例。关键字可以建立类的实例。第14页,本讲稿共73页 3.1.3 类的成员类的成员 1类的成员类型类的成员类型字段字段属性属性事件事件方法方法第15页,本讲稿共73页 2类成员的访问修饰符类成员的访问修饰符(1)public(2)private(3)protected(4)internal第16页,本讲稿共73页 3成员常量成员常量 可以使用关键字可以使用关键字const来声明类的常量来声明类的常量成员,类的常量可以加上以下修饰符:成员,类的常量可以加上以下修饰符:new、public、protected、internal和和private。第17页,本讲稿共73页修饰符修饰符修饰符用于限定类型以及类型成员的申明修饰符用于限定类型以及类型成员的申明,c#中有中有13种修饰符种修饰符,按按功能可分为三部分功能可分为三部分:存取修饰符存取修饰符,类修饰符和成员修饰符类修饰符和成员修饰符.存取修饰符存取修饰符:public:存取不受限制存取不受限制.private:只有包含该成员的类可以存取只有包含该成员的类可以存取.internal:只有当前项目程序可以存取只有当前项目程序可以存取.protected:只有包含该成员的类以及继承的类可以存取只有包含该成员的类以及继承的类可以存取.第18页,本讲稿共73页修饰符(续)修饰符(续)类修饰符类修饰符:abstract:可以被指示一个类只能作为其它类的基类可以被指示一个类只能作为其它类的基类.sealed:指示一个类不能被继承指示一个类不能被继承.成员修饰符成员修饰符:const:指定域或局部变量的值不能被改动指定域或局部变量的值不能被改动.event:声明一个事件声明一个事件.extern:指示方法在外部实现指示方法在外部实现.readonly:指示一个域只能在声明时以及相同类的内部被赋指示一个域只能在声明时以及相同类的内部被赋值值.第19页,本讲稿共73页修饰符(续)修饰符(续)成员修饰符(续)成员修饰符(续):static:静态成员,指一个成员属于类本身静态成员,指一个成员属于类本身,而不是属于特定的对而不是属于特定的对象象.abstract:抽象方法,指该方法没有实现的方法体抽象方法,指该方法没有实现的方法体.override:对由基类继承成员的新实现(重写)对由基类继承成员的新实现(重写).virtual:指示一个方法或存取器的实现可以在继承类中被覆盖指示一个方法或存取器的实现可以在继承类中被覆盖(虚方法)(虚方法).第20页,本讲稿共73页 4this关键字关键字 关键字关键字this可用于引用类的当前实例,可用于引用类的当前实例,可以在构造函数类的方法和类的实例中使可以在构造函数类的方法和类的实例中使用。用。第21页,本讲稿共73页 5静态成员与实例成员静态成员与实例成员1静态成员静态成员如果字段、方法、属性、事件、运算符或构造函数如果字段、方法、属性、事件、运算符或构造函数声明时指定了声明时指定了static修饰符,就等于声明了一个静态成员。修饰符,就等于声明了一个静态成员。2实例成员实例成员如果字段、方法、属性、事件、下标指示器、构造如果字段、方法、属性、事件、下标指示器、构造函数或析构函数声明时没有指定函数或析构函数声明时没有指定static修饰符,那么此时声修饰符,那么此时声明的是一个实例成员(也称为非静态成员)。明的是一个实例成员(也称为非静态成员)。第22页,本讲稿共73页 类的非静态成员属于类的实例所有,每创建一个类的实例,类的非静态成员属于类的实例所有,每创建一个类的实例,都在内存中为非静态成员开辟了一块区域;而类的静态成员属于都在内存中为非静态成员开辟了一块区域;而类的静态成员属于类所有,为这个类的所有实例所共享,无论这个类创建了多少个类所有,为这个类的所有实例所共享,无论这个类创建了多少个实例,一个静态成员在内存中只占有一块区域。实例,一个静态成员在内存中只占有一块区域。静态成员成为类的全程成员,在整个类的使用全程范围内有静态成员成为类的全程成员,在整个类的使用全程范围内有效,静态成员变量可以充当类的全程标志或计数变量。效,静态成员变量可以充当类的全程标志或计数变量。第23页,本讲稿共73页 由于静态成员函数全体共用的特性,它不能访由于静态成员函数全体共用的特性,它不能访问一般的类数据成员,而只能访问静态数据成员。问一般的类数据成员,而只能访问静态数据成员。同时,静态成员函数也不能使用同时,静态成员函数也不能使用this关键字,因为关键字,因为它不仅仅属于某个具体的实例。它不仅仅属于某个具体的实例。第24页,本讲稿共73页 3.1.4 构造函数构造函数 构造函数是类中与类名同名的成员函构造函数是类中与类名同名的成员函数,当一个类的实例生成时,系统会自动数,当一个类的实例生成时,系统会自动调用构造函数对实例进行初始化。调用构造函数对实例进行初始化。第25页,本讲稿共73页 3.1.5 析构函数析构函数 析构函数用于在实例生存周期结束时,析构函数用于在实例生存周期结束时,执行一些必要的操作,例如释放存储空间、执行一些必要的操作,例如释放存储空间、回收已分配的资源等。回收已分配的资源等。第26页,本讲稿共73页 3.1.6 域、属性和方法域、属性和方法 为了保存类的实例的各种数据信息,为了保存类的实例的各种数据信息,C#给提供了两种方法:域(也称为字段)给提供了两种方法:域(也称为字段)和属性。其中,属性实现了良好的数据封和属性。其中,属性实现了良好的数据封装和数据隐藏。装和数据隐藏。第27页,本讲稿共73页字段字段 在类块中声明字段的方式如下:在类块中声明字段的方式如下:字段修饰符字段修饰符 字段的类型字段的类型 字段的名称字段的名称“字段字段”是包含在类或结构中的对象或值。字段是包含在类或结构中的对象或值。字段使类可以封装数据。使类可以封装数据。第28页,本讲稿共73页属性属性 属性是这样的类成员:它们提供灵属性是这样的类成员:它们提供灵活的机制来读取、编写或计算私有活的机制来读取、编写或计算私有字段的值。字段的值。第29页,本讲稿共73页事件事件 基于基于 Windows 的应用程序和的应用程序和 Web 应应用程序都是基于事件驱动的应用程序,用程序都是基于事件驱动的应用程序,即根据事件来执行代码。即根据事件来执行代码。第30页,本讲稿共73页方法方法方法的声明方法的声明:格格式式:方方法法修修饰饰符符 返返回回类类型型说说明明符符 方方法法名名(形式参数说明列表形式参数说明列表)/*)/*定义方法头定义方法头*/*/变量、数组的定义语句变量、数组的定义语句;其它可执行部分其它可执行部分 第31页,本讲稿共73页 【案例【案例20】温度转换】温度转换 本案例中将设计一个可以进行将摄氏本案例中将设计一个可以进行将摄氏温度转换为华氏温度的程序,效果如图温度转换为华氏温度的程序,效果如图3-1-5所示。所示。第32页,本讲稿共73页 图图3-1-5 温度转换温度转换第33页,本讲稿共73页 在本例的实现过程中,将学习类的应在本例的实现过程中,将学习类的应用,案例实现过程如下。用,案例实现过程如下。第34页,本讲稿共73页 1创建项目创建项目 2代码编辑代码编辑第35页,本讲稿共73页 【案例【案例21】圆形计算】圆形计算 本案例中将设计一个可以进行圆形周本案例中将设计一个可以进行圆形周长与面积计算的程序,效果如图长与面积计算的程序,效果如图3-1-6所示。所示。第36页,本讲稿共73页 图图3-1-6 圆形计算圆形计算第37页,本讲稿共73页 在本例的实现过程中,将学习类的构在本例的实现过程中,将学习类的构造函数、属性和方法的应用,案例实现过造函数、属性和方法的应用,案例实现过程如下。程如下。第38页,本讲稿共73页 1创建项目创建项目 2代码编辑代码编辑第39页,本讲稿共73页 3.2 3.2 继承、多态与接口继承、多态与接口 3.2.1 继承继承 1继承的概念继承的概念 继承是指从已有的类型出发,在此基继承是指从已有的类型出发,在此基础上建立新的类型,新类型具备原有类型础上建立新的类型,新类型具备原有类型的功能和特性,也能在新类型中对原有类的功能和特性,也能在新类型中对原有类型的功能进行更新和扩展。继承的核心就型的功能进行更新和扩展。继承的核心就是代码的重用。是代码的重用。第40页,本讲稿共73页 新的类型继承了原有类型的特性,新新的类型继承了原有类型的特性,新类型称为原有类型的派生类(子类),原类型称为原有类型的派生类(子类),原有类型称为新类型的基类(父类)。有类型称为新类型的基类(父类)。继承的主要特点。继承的主要特点。第41页,本讲稿共73页 2继承的实现继承的实现 创建继承基类的派生类的定义格式如创建继承基类的派生类的定义格式如下:下:class 派生类名派生类名:基类名基类名 /派生类成员定义派生类成员定义 第42页,本讲稿共73页派生类(续)派生类(续)派生类(续)派生类(续)访问修饰符访问修饰符“protected”可以将类成员的作用域限可以将类成员的作用域限制在本类及其派生类中。制在本类及其派生类中。2、Protected 访问修饰符第43页,本讲稿共73页在派生类中调用基类构造函数在派生类中调用基类构造函数 1.1.执行顺序执行顺序因为派生类要使用基类,所以基类实例化必因为派生类要使用基类,所以基类实例化必须在派生类实例化之前进行。须在派生类实例化之前进行。2.调用特定的构造函数调用特定的构造函数如果想要调用基类的非默认构造函数,那么必如果想要调用基类的非默认构造函数,那么必须使用须使用 base 关键字。关键字。第44页,本讲稿共73页类的继承类的继承(1)C#中的派生类只能继承于一个类,派生类将继承基类中的派生类只能继承于一个类,派生类将继承基类的除构造函数和析构函数外的其他所有成员。的除构造函数和析构函数外的其他所有成员。(2)继承具有传递性,若)继承具有传递性,若A派生出类派生出类B,类,类B有派生出类有派生出类C,则类则类C不仅继承了类不仅继承了类B的成员,同样也继承了类的成员,同样也继承了类A的成员。的成员。(3)派生类可以对基类的功能进行扩展,即派生类可以增)派生类可以对基类的功能进行扩展,即派生类可以增加自己新的成员,但不能删除已继承的成员,只能不予加自己新的成员,但不能删除已继承的成员,只能不予使用。使用。第45页,本讲稿共73页在派生类中使用基类成员在派生类中使用基类成员在派生类中使用基类成员在派生类中使用基类成员 当需要扩展基类方法的功能时,在派生类中调用当需要扩展基类方法的功能时,在派生类中调用基类方法是一个很好的选择。基类方法是一个很好的选择。除了可以在派生类的重写方法中添加额外的功能之外,除了可以在派生类的重写方法中添加额外的功能之外,通过在新写的方法中调用基类方法,可以重用基类方通过在新写的方法中调用基类方法,可以重用基类方法的代码。法的代码。第46页,本讲稿共73页 3继承中的覆盖与重载继承中的覆盖与重载 如果在派生类中,声明了与基类同名的成员,但成员方法的参数如果在派生类中,声明了与基类同名的成员,但成员方法的参数有所不同(就像函数的重载一样),此时称派生类成员对基类成员有所不同(就像函数的重载一样),此时称派生类成员对基类成员进行了重载。进行了重载。如果派生类定义了与基类成员同名的新成员,则新定义的如果派生类定义了与基类成员同名的新成员,则新定义的这个成员就会覆盖已继承的成员,所继承的那个同名成员则不这个成员就会覆盖已继承的成员,所继承的那个同名成员则不能再访问。能再访问。第47页,本讲稿共73页密封类密封类 在在 C#C#中,有一种类称为密封类。当把某个类声明为密封类时,中,有一种类称为密封类。当把某个类声明为密封类时,编译器将禁止所有类继承该类。编译器将禁止所有类继承该类。把一个类声明为密封类的原因是为了防止该类被其它类继承,把一个类声明为密封类的原因是为了防止该类被其它类继承,密封类的声明方法是在类名前加上密封类的声明方法是在类名前加上sealed修饰符。修饰符。一般情况下,类是不一般情况下,类是不“密封的密封的”,因为一旦把某个类声明,因为一旦把某个类声明为密封类,这个类将永远不能再扩展了。但是,如果某个类具为密封类,这个类将永远不能再扩展了。但是,如果某个类具有特殊的实现,并且不允许其他任何类继承该类,那么就需要有特殊的实现,并且不允许其他任何类继承该类,那么就需要把此类声明为密封类。把此类声明为密封类。第48页,本讲稿共73页 3.2.2 多态多态 1多态的概念多态的概念 在在C#中,多态的定义是:同一操作作中,多态的定义是:同一操作作用于不同的类的实例时,不同的类将进行用于不同的类的实例时,不同的类将进行不同的解释,最后产生不同的执行结果。不同的解释,最后产生不同的执行结果。第49页,本讲稿共73页 C#支持两种类型的多态:编译时的多态和运行时的多态。支持两种类型的多态:编译时的多态和运行时的多态。(1)编译时的多态:)编译时的多态:编译时的多态性是通过方法的重载实编译时的多态性是通过方法的重载实现的,由于这些同名的重载方法或者参数类型不同或者参数现的,由于这些同名的重载方法或者参数类型不同或者参数个数不同,所以编译系统在编译期间就可以确定用户所调用个数不同,所以编译系统在编译期间就可以确定用户所调用的方法是哪一个重载方法。的方法是哪一个重载方法。(2)运行时的多态:)运行时的多态:运行时的多态性是通过继承和虚成员来运行时的多态性是通过继承和虚成员来实现的。运行时的多态性是指系统在编译时不确定选用哪个重实现的。运行时的多态性是指系统在编译时不确定选用哪个重写方法,而是直到程序运行时,才根据实际情况决定采用哪个写方法,而是直到程序运行时,才根据实际情况决定采用哪个重写方法。重写方法。第50页,本讲稿共73页 2虚方法虚方法 在类中的方法声明前加上在类中的方法声明前加上virtual修饰修饰符,就称之为虚方法,反之为非虚方法。符,就称之为虚方法,反之为非虚方法。使用使用virtual修饰符后,不允许再使用修饰符后,不允许再使用static、abstract或或override修饰符。修饰符。第51页,本讲稿共73页virtual 关键字关键字 虚方法的定义要用到虚方法的定义要用到virtual关键字关键字,如下所示:,如下所示:public class Animal public virtual void Eat()Console.WriteLine(Eat something);这样,这样,Animal 类的任何派生类都可以实现新的类的任何派生类都可以实现新的 Eat()方法。方法。第52页,本讲稿共73页overrideoverride 关键字关键字关键字关键字 如果在派生类中要重写基类方法,那么需要使用如果在派生类中要重写基类方法,那么需要使用 override 关键字,如下所示:关键字,如下所示:public class Cat:Animal public override void Eat()Console.WriteLine(Eat small animals);第53页,本讲稿共73页调用虚方法调用虚方法通过使用多态性,可以采用一种通用的方式来处理派生类。为通过使用多态性,可以采用一种通用的方式来处理派生类。为此,可以认为派生类对象的类型是基类类型。此,可以认为派生类对象的类型是基类类型。当在程序中调用某个虚方法时,运行时可以判定应该具体当在程序中调用某个虚方法时,运行时可以判定应该具体调用哪个方法。事实上,系统将调用最底层的派生方法。调用哪个方法。事实上,系统将调用最底层的派生方法。如果原始虚方法没有被重写,那么最底层的派生方法就是如果原始虚方法没有被重写,那么最底层的派生方法就是原始虚方法,否则,最底层的派生方法就是相应对象中的原始虚方法,否则,最底层的派生方法就是相应对象中的重写方法。重写方法。第54页,本讲稿共73页 3.2.3 抽象类抽象类 1抽象类抽象类 某些情况下,基类并不与具体的事物某些情况下,基类并不与具体的事物相联系,而是只表达一种抽象的概念,用相联系,而是只表达一种抽象的概念,用来为它的派生类提供一个公共的接口,为来为它的派生类提供一个公共的接口,为此此C#中引入了抽象类(中引入了抽象类(abstract class)的)的概念。概念。第55页,本讲稿共73页 抽象类使用抽象类使用abstract修饰符进行说明,修饰符进行说明,定义格式如下:定义格式如下:abstract class 类名类名 第56页,本讲稿共73页 2抽象方法抽象方法 由于抽象类本身表达的是抽象的概念,由于抽象类本身表达的是抽象的概念,因此类中的许多方法并不一定要有具体的因此类中的许多方法并不一定要有具体的实现,而只是留出一个接口,来作为派生实现,而只是留出一个接口,来作为派生类重载的界面。类重载的界面。第57页,本讲稿共73页 一个方法声明中如果加上一个方法声明中如果加上abstract 修修饰符,则称该方法为抽象方法(饰符,则称该方法为抽象方法(abstract method)。)。第58页,本讲稿共73页 格式如下:格式如下:修饰符修饰符 abstract 类型类型 方法名称(参数)方法名称(参数);第59页,本讲稿共73页优点优点 抽象方法的优点在于基类无需对抽象方法提供实抽象方法的优点在于基类无需对抽象方法提供实现,但是基类的派生类必须为基类中的抽象方法现,但是基类的派生类必须为基类中的抽象方法提供实现。提供实现。第60页,本讲稿共73页重写重写当派生类从抽象类中继承一个抽象方法时,派生当派生类从抽象类中继承一个抽象方法时,派生类必须重写该抽象方法。这个规则在编译时强制类必须重写该抽象方法。这个规则在编译时强制实施。实施。第61页,本讲稿共73页 【案例【案例22】圆与圆柱】圆与圆柱 本案例中将设计一个可以进行圆和圆本案例中将设计一个可以进行圆和圆柱体的计算的程序,效果如图柱体的计算的程序,效果如图3-2-3所示。所示。第62页,本讲稿共73页 图图3-2-3 圆与圆柱圆与圆柱第63页,本讲稿共73页 在本例的实现过程中,将学习类的继在本例的实现过程中,将学习类的继承的应用,案例实现过程如下。承的应用,案例实现过程如下。1创建项目创建项目 2代码编辑代码编辑第64页,本讲稿共73页3.3 3.3 接口接口 3.3.1 接口接口 接口是用来组织类内容的一种程序结接口是用来组织类内容的一种程序结构,一个类可以实现多个接口。接口的定构,一个类可以实现多个接口。接口的定义格式如下:义格式如下:修饰符修饰符 interface 接口名称接口名称 /接口成员定义接口成员定义 第65页,本讲稿共73页 3.3.2接口的成员接口的成员 接口可以包含一个和多个成员,这些成员可以是接口可以包含一个和多个成员,这些成员可以是方法、属性、索引指示器和事件,但不能是常量、域、方法、属性、索引指示器和事件,但不能是常量、域、操作符、构造函数或析构函数,而且不能包含任何静操作符、构造函数或析构函数,而且不能包含任何静态成员。态成员。接口成员默认访问方式是接口成员默认访问方式是public。第66页,本讲稿共73页 3.3.2接口的实现接口的实现 通过类来实现接口。用类来实现接口通过类来实现接口。用类来实现接口时,接口的名称必须包含在类声明中的基时,接口的名称必须包含在类声明中的基类列表中。类列表中。第67页,本讲稿共73页实现接口实现接口实现接口实现接口 要实现一个接口,必须要有类继承该接口。要实现一个接口,必须要有类继承该接口。接口的实现类可以是派生类,并且这些派生类可以接口的实现类可以是派生类,并且这些派生类可以包括一些自己特有的类成员。包括一些自己特有的类成员。第68页,本讲稿共73页继承多个接口继承多个接口 若要实现多接口继承,则需要列出这些接口,这些接若要实现多接口继承,则需要列出这些接口,这些接口之间用逗号分开,如下所示:口之间用逗号分开,如下所示:class Chimpanzee:Animal,ICarnivore,IHerbivore 第69页,本讲稿共73页继承接口的接口继承接口的接口 接口可以继承一个或多个其他接口(这一点与类不接口可以继承一个或多个其他接口(这一点与类不一样)。为了继承多个其他接口,需要在接口名后一样)。为了继承多个其他接口,需要在接口名后书写冒号,然后书写用逗号隔开的父接口列表。接书写冒号,然后书写用逗号隔开的父接口列表。接口将继承它所有父接口的所有成员,并且接口用户口将继承它所有父接口的所有成员,并且接口用户必须实现所有被继承接口的所有成员。必须实现所有被继承接口的所有成员。第70页,本讲稿共73页 【案例【案例23】绘图类接口】绘图类接口 本案例中将设计一个可以进行圆和圆本案例中将设计一个可以进行圆和圆柱体的计算的程序,效果如图柱体的计算的程序,效果如图3-3-1所示。所示。第71页,本讲稿共73页 图图3-3-1 绘图类接口绘图类接口第72页,本讲稿共73页 在本例的实现过程中,将学习通过接在本例的实现过程中,将学习通过接口来提供通用的方法,案例实现过程如下。口来提供通用的方法,案例实现过程如下。1创建项目创建项目 2代码编辑代码编辑 思考与练习思考与练习3第73页,本讲稿共73页