VisualStudio.Net—面向对象(Object-Oriented)楚雄应用技术学院第‹#›页Vb.Net面向对象—本章内容提要及教学目标面向对象的核心思想是什么?为什么要面向对象?在VB.NET中如何使定义类、创建和使用对象掌握类成员访问控制小结了解.Net平台的基本类库理解面向对象的关键技术:(继承、封装、多态)VisualStudio.Net第‹#›页为什么需要面向对象的设计?什么是面向对象?软件开发中最复杂的问题是什么?面向对象的方法和其他方法相比有什么好处?面向对象包含哪些内容?VisualStudio.Net第‹#›页为什么需要面向对象的设计?软件生命周期系统定义7%系统设计6%系统编程7%系统测试13%系统维护67%系统定义系统设计系统编程系统测试系统维护VisualStudio.Net第‹#›页为什么需要面向对象的设计?•从上图中可以看到软件从开发到终结的5个过程中耗费最大的是软件交付使用后维护阶段。如何让软件变得更易于维护?采用更好的软件设计方法面向对象的方法学Object-Oriented缩写为OOVisualStudio.Net第‹#›页什么是面向对象?面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。面向对象(Object-Oriented,缩写为OO)方法学问题空间(问题域)解空间(求解域)相一致VisualStudio.Net第‹#›页面向对象包含哪些内容?面向对象的分析(OOAObjectOrientedAnalysis)面向对象的设计(OODObjectOrientedDesign)面向对象的编程实现(OOPObjectOrientedProgramming)明确系统做什么What系统定义明确怎么做的过程How系统具体实现的过程Do系统开发VisualStudio.Net第‹#›页面向对象思想•面向对象的思想的核心—抽象抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程在系统开发中,抽象指的是在决定如何实现对象之前的对象的意义和行为。使用抽象可以尽可能避免过早考虑一些细节使复杂度降低,以得到问题域中较简单的概念过程抽象数据抽象VisualStudio.Net第‹#›页什么是抽象?抽象VisualStudio.Net第‹#›页面向对象的基本概念类:是对一类事物的描述,是抽象概念的定义用于描述事物种类(类别或分类),是对象的模版,是创建对象的蓝图。对象:类的实例,是实际存在的该类事物的个体。类的设计更为关键Personnamesexbirthday….Move()Speak()Learn()….UML类图类名属性:描述类的静态特征方法:描述类具有的行为VisualStudio.Net第‹#›页ClassPersonPrivate_nameAsStringPrivate_sexAsStringProtectedbirthdayAsDateProtectedcountryAsStringPropertyname()AsStringGetReturn_nameEndGetSet(ByValvalueAsString)_name=valueEndSetEndPropertyPropertysex()AsStringGetReturn_sexEndGetSet(ByValvalueAsString)_sex=valueEndSetEndPropertySubmove(ByValvalueAsString)MessageBox.Show(移动)EndSubSubspeak()MessageBox.Show(讲话)EndSubSublearn()MessageBox.Show(学习)EndSubEndClassVb.Net中类的定义Class类名字段属性方法事件EndClass类名字段属性方法VisualStudio.Net第‹#›页创建对象类New关键字对象newperson()‘创建了一个Person对象为了方便对对象的控制和访问,我们应该定义一个对象变量来指向对象DimobjPersonasPerson‘定义对象变量objPerson=newPerson()‘创建对象并把对象的地址存放到对象变量中Person对象objPersonVisualStudio.Net第‹#›页对象和类的关系类对象实例化VisualStudio.Net第‹#›页对象和类的关系对象的抽象是类类的具体化就是对象,也可以说类的实例是对象类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。类之间的关系在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系:即一般--具体结构关系,整体--部分结构关系。①一般——具体结构称为分类结构(泛化),也可以说是“或”关系,或者是“isa”关系。如:宝马车(子类)是一种交通工具(父类)②整体——部分结构称为组装结构(聚合),它们之间的关系是一种“与”关系,或者是“hasa”关系。如:宝马车(类)有4个轮子(类)VisualStudio.Net第‹#›页构造函数构造函数:是一个特殊的方法,每个类都有,在创建对象时被调用的过程,一般用来给对象的相关属性赋值。Class类名字段属性SubNew(参数)…EndSub方法事件EndClassNewPerson(张三,男,#1/10/1980#)或DimobjPersonasPersonobjPerson=NewPerson(张三,男,#1/10/1980#)VisualStudio.Net第‹#›页继承(泛化)代码重用•继承:子类继承父类中所有非Private成员。包含(字段、属性、方法和事件)人小学生继承中学生继承大学生继承VisualStudio.Net第‹#›页Vb.Net中类的继承Class类名Inherits父类字段属性方法事件EndClassClassstudentInheritsPersonPrivate_idAsStringPrivate_addressAsString…EndClass例小学生类Person类学生类工人类农民类中学生类..学生类类的层次结构VisualStudio.Net第‹#›页继承的相关问题子类是否拥有父类所有字段、属性、方法、事件?父类中的某些方法无法满足子类需求,怎么办?子类中的成员和父类中成员相同时怎么办?VB.net有哪些方法实现继承?子类如何调用父类的方法?VisualStudio.Net第‹#›页访问控制权限Private只在本类中可用Protected在本类和本类的派生类中可用的成员Friend只在当前项目中可用ProtectedFriend在本类和本类的派生类中可用的成员Public类以外的代码也可以访问默认为Public在继承中,子类继承父类中所有的非Private成员在VB.net中共有以下5种访问级别访问范围扩大VisualStudio.Net第‹#›页多态性之一方法重写和覆盖父类中的某些方法无法满足子类需求,怎么办?方法重写:子类重写父类中某个方法,父类中的该方法必须在前面加Overridable关键字,否则子类不可重写父类中的该方法。子类该重写方法前加Overrides关键字表明该方法为重写方法。(若类中某方法不想被子类重写,可在前加NotOverridable关键字)若子类出现同父类中同名的字段、属性、方法、事件,则该子类成员应加上Shadows关键字屏蔽父类中的同名成员。否则出错VisualStudio.Net第‹#›页多态性之一方法重写ClassPerson…overridablepublicSubspeak()msgbox(“交谈”)endSub…EndClassClasschinese:InheritsPerson…OverridespublicSubspeak()msgbox(“用中文交谈”)endSub…EndClassClassstudendInheritschinese…OverridespublicSubspeak()msgbox(“用普通话交谈”)endSub…EndClassVisualStudio.Net第‹#›页多态性之一方法重写‘创建PersonChineseStudent三个类的对象并让对象变量指向它们DimobjPersonasPerson=newPerson(“无名”,“女”)DimobjChineseasChinese=newChinese(“刘德华”,“男”)DimobjStudentasStudent=newStudent(“小强”,“男”)‘分别调用它们的speak方法objPerson.speak()objChinese.speak()objStudent.speak()分析以上代码的显示结果是什么?VisualStudio.Net第‹#›页多态性之一重写子类如何调用父类的方法MyBase当重写派生类中的方法时,可以使用MyBase关键字调用基类中的方法。MyClass关键字的行为与最初实现时引用类的当前实例的对象变量的行为相似。MyClass类似于Me,但在调用MyClass中的每个方法和属性时,可将此方法或属性当作NotOverridable中的方法或属性对待。因此,方法或属性不受派生类中重写的影响Me关键字的行为与引用类的当前实例的对象变量类似。一个类可以有多个实例,me提供了一种方法,用来引用代码正在执行的该类的特定实例。VisualStudio.Net第‹#›页多态性之一覆盖子类中的成员和父类中成员相同时怎么办?ClassPerson…publicSubspeak()msgbox(“交谈”)endSub…EndClassClasschinese:InheritsPerson…ShadowspublicSubspeak()msgbox(“用中文交谈”)endSub…EndClass如果子类中存在与父类同名的方法或字段、属性、事件,父类相关成员之前没有overridable关键字,则应在子类成员前加Shadows关键字来屏蔽父类中的同名成员。VisualStudio.Net第‹#›页多态性之二重载重载:Overloads,用同样的名称,用不同的参数列表来创建多个方法和属性,在调用时就可以适应不同参数类型的要求ClassPersonprivate_nameasstringprivate_sexasstringSubnew()EndsubSubnew(str1asstring)_name=str1EndsubSubnew(str1asstring,str2asstring)_name=str1_sex=str2EndsubEndClass版本1三个版本的构造函数版本2版本3NewPerson()NewPerson(“张三”)NewPerson(“李四”,“女”)VisualStudio.Net第‹#›页多态性之二重载Dimp1,p2AsPersonP1=NewPerson(“刘德华”)P2=NewPerson(“刘德华”)现在要判断这两个“刘德华”对象是否相等?所有的类都继承自Object类,Object类是.Net中所有类的祖先。Object类有一个Equals()函数,用来判断两个实例是否相等。Ifp1.Equals(p2)=TrueThenmsgbox(“相等)Elsemsgbox(“不相等)EndIfDima,basIntegera=2b=2Ifa.Equals(b)=TrueThenmsgbox(“相等)Elsemsgbox(“不相等)EndIf比较VisualStudio.Net第‹#›页多态性之二重载上例中左图结果为“不相等”,右图结果