C面向对象编程基础实用教案

上传人:桔**** 文档编号:568431328 上传时间:2024-07-24 格式:PPT 页数:69 大小:1.60MB
返回 下载 相关 举报
C面向对象编程基础实用教案_第1页
第1页 / 共69页
C面向对象编程基础实用教案_第2页
第2页 / 共69页
C面向对象编程基础实用教案_第3页
第3页 / 共69页
C面向对象编程基础实用教案_第4页
第4页 / 共69页
C面向对象编程基础实用教案_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《C面向对象编程基础实用教案》由会员分享,可在线阅读,更多相关《C面向对象编程基础实用教案(69页珍藏版)》请在金锄头文库上搜索。

1、17.1类继承7.2访问(fngwn)继承的成员7.3隐藏基类成员7.4基类访问(fngwn)7.5使用基类的引用7.6构造函数的执行7.7成员访问(fngwn)修饰符7.8抽象成员7.9抽象类7.10密封类7.11静态类7.12扩展方法7.13外部方法第1页/共68页第一页,共69页。27.1类继承类继承(jchng)通过继承我们可以定义一个新类,新类纳入一个已经声明的类并进行扩展。可以使用一个已经存在的类作为新类的基础。已存在的类称为基类(baseclass),新类称为派生类(derivedclass)。派生类成员的组成如下:自己声明中的成员基类的成员要声明一个派生类,需要在类名后加入基类

2、规则说明。基类规则说明由冒号和后面跟着用作基类的名称组成。派生类被描述为直接继承自列出的基类派生类被描述为扩展它的基类,因为(ynwi)它包含了基类的成员,加上在它自己的声明中的任何附加功能派生类不能删除它所继承的任何成员第2页/共68页第二页,共69页。37.1类继承类继承(jchng)第3页/共68页第三页,共69页。47.2访问继承访问继承(jchng)的成员的成员继承的成员可以被访问,就像它们是派生类自己声明(shngmng)的一样。例子:AccessBaseClassMember.sln第4页/共68页第四页,共69页。57.2访问继承访问继承(jchng)的成员的成员第5页/共68

3、页第五页,共69页。6所有所有(suyu)类都派生自类都派生自object类类除了特殊的类object,所有的类都是派生类,即使它们没有基类规格说明(shumng)。类object是唯一的非派生类,因为它是继承层次结构的基础。没有基类规格说明(shumng)的类隐式地直接派生自object。不加基类规格说明(shumng)只是指定object为基类的简写。第6页/共68页第六页,共69页。7所有所有(suyu)类都派生自类都派生自object类类关于类继承的其他重要内容如下:一个类声明的基类规格说明只能有一个单独的类。这称为单继承。虽然类只能直接继承一个基类,但继承的层次没有限制。也就是说,作

4、为基类的类可以派生自另外一个类,而它又可以派生自另外一个类,一直下去,直至(zhzh)最终到object。第7页/共68页第七页,共69页。87.3隐藏隐藏(yncng)基类成员基类成员虽然派生类不能删除它继承的任何成员,但它可以隐藏它们。要隐藏一个继承的数据成员。需要声明一个新的相同类型的成员,并使用相同的名称通过(tnggu)在派生类中声明新的带有相同签名的函数成员,可以隐藏或掩盖继承的函数成员要让编译器知道我们在故意隐藏继承的成员,使用new修饰符。没有它,程序可以成功编译,但编译器会警告隐藏了一个继承的成员也可以隐藏静态成员例子:MaskBaseMember.sln第8页/共68页第八

5、页,共69页。97.3隐藏隐藏(yncng)基类成员基类成员第9页/共68页第九页,共69页。107.4基类访问基类访问(fngwn)有时,派生类需要访问被隐藏的继承成员。可以使用基类访问表达式访问隐藏的基类成员。基类访问表达式由关键字base后面跟着一个点和成员的名称组成(zchn),如下所示:第10页/共68页第十页,共69页。117.4基类访问基类访问(fngwn)第11页/共68页第十一页,共69页。127.5使用使用(shyng)基类的引用基类的引用派生类的实例由基类的实例加上派生类附加的成员组成。派生类的引用(ynyng)指向整个类对象,包括基类部分。如果有一个派生类对象的引用(y

6、nyng),就可以获取该对象基类部分的引用(ynyng),使用类型转换运算符把该引用(ynyng)转换为基类类型。类型转换运算符放在对象引用(ynyng)的前面,由圆括号括起的要被转换成的类名组成。例子:UseBaseReference.sln第12页/共68页第十二页,共69页。137.5使用使用(shyng)基类的引用基类的引用第13页/共68页第十三页,共69页。14虚方法虚方法(fngf)和覆写方法和覆写方法(fngf)前面我们看到,当使用基类引用访问(fngwn)派生类对象时,得到的是基类的成员。虚方法可以使基类的引用访问(fngwn)“升至”派生类内。可以使用基类引用调用派生类的方

7、法,只需要满足下面的条件:派生类的方法和基类的方法有相同的签名和返回类型基类的方法使用virtual标注派生类的方法使用override标注第14页/共68页第十四页,共69页。15虚方法虚方法(fngf)和覆写方法和覆写方法(fngf)第15页/共68页第十五页,共69页。16虚方法虚方法(fngf)和覆写方法和覆写方法(fngf)关于virtual和override修饰符的重要事项如下所示:覆写和被覆写的方法必须有相同可访问性。也就是说,被覆写的方法不能是private等,而覆写方法是public不能覆写static方法或非虚方法方法、属性和索引(suyn),以及事件,它们都可以被声明为v

8、irtual和override。例子:VirtualMethod.sln第16页/共68页第十六页,共69页。17覆写标记覆写标记(bioj)为为override的方法的方法覆写方法可以(ky)在继承的任何层次出现:当使用对象基类部分的引用调用一个覆写的方法时,方法的调用被沿派生层次上溯执行,一直到标记为override的方法的最派生(most-derived)版本。情况1:使用override声明例子:Virtual_override.sln情况2:使用new声明例子:Virtual_override_new.sln第17页/共68页第十七页,共69页。187.6构造函数的执行构造函数的执行

9、(zhxng)在前面,我们看到构造函数执行代码,准备一个类以使用。这包括初始化类的静态成员和实例成员。在这一部分,我们会看到派生类对象(duxing)有一部分就是基类对象(duxing)。要创建对象(duxing)的基类部分,基类的一个构造函数被作为创建实例过程的一部分被调用继承层次链中的每个类在执行它自己的构造函数之前执行它的基类的构造函数第18页/共68页第十八页,共69页。197.6构造函数的执行构造函数的执行(zhxng)当一个实例被创建时,完成的第一件事是初始化对象的所有实例成员。在此之后,基类的构造函数被调用,然后(rnhu)该类自己的构造函数才被执行。第19页/共68页第十九页,

10、共69页。20构造函数初始化语句构造函数初始化语句(yj)默认情况下,在对象被构造时,基类的无参数构造函数被调用。但构造函数可以被重载,所以基类可能有一个以上的构造函数。如果希望派生类使用一个指定(zhdng)的基类构造函数而不是无参数构造函数,必须在构造函数初始化语句中指定(zhdng)它。有两种形式的构造函数初始化语句:第一种形式使用关键字base并指明使用哪一个基类构造函数第二种形式使用关键字this并指明应该使用当前类的哪一个另外的构造函数基类构造初始化语句放在冒号后面,冒号紧跟着类的构造函数声明的参数列表。构造函数初始化语句由关键字base和要调用的基类构造函数的参数列表组成。第20

11、页/共68页第二十页,共69页。21构造函数初始化语句构造函数初始化语句(yj)例子(lzi):BaseKeywordExample.sln第21页/共68页第二十一页,共69页。22类访问类访问(fngwn)修饰符修饰符类可以被系统中其他类看到并访问。术语可见的有时用作术语可访问的。它们可以被互相访问。类的可访问性有两个级别:public和internal。标记为public的类可以被系统内任何程序集中的代码访问标记为internal的类只能被它自己所在的程序集内的类看到这是默认(mrn)的可访问级别,所以,只有在类的声明中显式地指定修饰符public,程序集外部的代码才能访问该类可以使用i

12、nternal访问修饰符显式地声明一个类为内部的第22页/共68页第二十二页,共69页。23类访问类访问(fngwn)修饰符修饰符第23页/共68页第二十三页,共69页。247.7成员成员(chngyun)访问修饰符访问修饰符到现在为止,我们只讨论了类的可访问性。成员(数据(shj)成员和函数成员)的可访问性描述了类成员的可见性。声明在类中的每个成员对系统的不同部分可见,这依赖于类声明中指派给它的访问修饰符。有7个成员访问级别:公有的(public)私有的(private)受保护的(protected)内部的(internal)受保护内部的(protectedinternal)第24页/共68

13、页第二十四页,共69页。257.7成员成员(chngyun)访问修饰符访问修饰符第25页/共68页第二十五页,共69页。267.7成员成员(chngyun)访问修饰符访问修饰符必须对每个成员指定成员访问级别。如果不指定某个成员的访问级别,它的隐式访问级别为 private成员不能比它的类更可访问。也就是说,如果一个(y)类的可访问性限于它所在的程序集,那么类的成员个体也不能从程序集的外部看到,无论它们的访问修饰符是什么第26页/共68页第二十六页,共69页。27公有成员公有成员(chngyun)的可访问性的可访问性public访问级别是限制性最少的。所有的类,包括程序集内部的类和外部的类都可以

14、(ky)自由地访问成员。第27页/共68页第二十七页,共69页。28私有成员私有成员(chngyun)的可访问性的可访问性私有成员的可访问性限制是最严格的。private类成员只能被它自己的类的成员访问。它不能被其他的类访问,包括继承(jchng)它的类然而,private成员能被嵌套在它的类中的成员访问第28页/共68页第二十八页,共69页。29受保护成员受保护成员(chngyun)的可访问性的可访问性protected访问级别如同private访问级别,除了一点,它允许(ynx)派生自该类的类访问该成员。第29页/共68页第二十九页,共69页。30内部成员内部成员(chngyun)的可访问

15、性的可访问性标记为internal的成员对程序集内部的所有类可见(kjin),但对程序集外部的类不可见(kjin)。第30页/共68页第三十页,共69页。31受保护内部成员受保护内部成员(chngyun)的可访问性的可访问性标记(bioj)为protectedinternal的成员对所有继承该类的类以及所有程序集内部的类可见。例子:MemberAccessModifier.sln第31页/共68页第三十一页,共69页。327.8抽象抽象(chuxing)成员成员抽象成员(chngyun)是被设计来覆写的函数成员(chngyun)。抽象成员(chngyun)有以下特征:它被用abstract修饰

16、符标记它没有实现代码块。抽象成员(chngyun)的代码块被分号代替第32页/共68页第三十二页,共69页。337.8抽象抽象(chuxing)成员成员关于抽象成员的其他重要事项如下:尽管抽象方法必须在派生类中用相应的方法覆写,但不能把virtual修饰符附加到abstract修饰符就像虚方法,派生类中抽象方法的实现(shxin)必须指定override修饰符抽象成员只能被声明在抽象类中第33页/共68页第三十三页,共69页。347.8抽象抽象(chuxing)成员成员比较(bjio)虚成员和抽象成员:虚成员虚成员抽象成员抽象成员关键字virtualabstract实现体有实现体没有实现体,被

17、分号取代在派生类中被写能被覆写,使用override必须被覆写,使用override成员的类型方法 属性事件 索引方法 属性事件 索引第34页/共68页第三十四页,共69页。357.9抽象类抽象类抽象类只能被用作其他(qt)类的基类。抽象类就是被设计来被继承用的。不能创建抽象类的实例抽象类使用abstract修饰符声明第35页/共68页第三十五页,共69页。367.9抽象类抽象类抽象类可以包含抽象成员,但不是必须的。抽象类的成员可以是抽象成员和普通带实现的成员的任意(rny)组合抽象类可以派生自另一个抽象类。例子:AbstractClass.slnAbstractExample.sln第36页

18、/共68页第三十六页,共69页。377.9抽象类抽象类第37页/共68页第三十七页,共69页。387.10密封密封(mfng)类类密封类的重要事项(shxing):密封类只能被用作独立的类,它不能被用作基类密封类使用sealed修饰符标记第38页/共68页第三十八页,共69页。397.11静态静态(jngti)类类静态类是这样一种类,在类中所有的成员都是静态的。静态类用于分组不受实例数据影响的数据和函数。静态类的一个普通的用途就是创建一个包含一组数学(shxu)方法的数学(shxu)库。关于静态类的重要事项如下:类本身必须标记为static类的所有成员必须是静态的类可以有一个静态构造函数,但没

19、有实例构造函数,不能创建该类的实例不能继承静态类,它们是密封的第39页/共68页第三十九页,共69页。407.11静态静态(jngti)类类第40页/共68页第四十页,共69页。417.12扩展扩展(kuzhn)方法方法在迄今为止的内容中,我们所看到的每个方法都和声明它们的类相关联。C#3.0扩展方法扩展了这个边界,允许编写(binxi)和声明它的类之外的类关联的方法。看下面MyData类,假如想追加一个更有用的方法,应该怎么办?第41页/共68页第四十一页,共69页。427.12扩展扩展(kuzhn)方法方法第42页/共68页第四十二页,共69页。437.12扩展扩展(kuzhn)方法方法如

20、果有源代码改源代码然而,如果不能修改这个(zhge)类,那就把这个(zhge)类当作一个基类并在派生自它的类中实现这个(zhge)增加的方法如果不能访问源代码,或该类是密封的等原因。那就在另一个类中使用该类的公有成员编写一个方法第43页/共68页第四十三页,共69页。447.12扩展扩展(kuzhn)方法方法第44页/共68页第四十四页,共69页。457.12扩展扩展(kuzhn)方法方法然而,还使用扩展方法特性来做。在参数声明中的类型名前增加(zngji)关键字this,把this关键字加到静态类的静态方法的第一个参数上,把方法从类的正规方法变为一个类的扩展方法。第45页/共68页第四十五页

21、,共69页。467.12扩展扩展(kuzhn)方法方法扩展方法重要的事项如下:扩展方法必须被声明为static扩展方法声明所在的类也必须被声明为static扩展方法必须包含关键字this作为它的第一个参数类型,并在后面(humian)跟着它所扩展的类的名称第46页/共68页第四十六页,共69页。477.12扩展扩展(kuzhn)方法方法扩展方法(fngf)的例子:ExtensionMethod.sln第47页/共68页第四十七页,共69页。487.13外部外部(wib)方法方法外部(wib)方法(externalmethod)是在声明中没有实现的方法。其实常常是用C#语言之外的语言编写的方法。

22、外部(wib)方法使用extern修饰符标记,而且在类的声明没有实现。它的实现被分号取代。第48页/共68页第四十八页,共69页。497.13外部外部(wib)方法方法声明和实现的连接是依赖(yli)实现的,但常常使用DllImport特性完成例子:ExternalMethod.sln第49页/共68页第四十九页,共69页。507.2 多态多态7.2.1理解(lji)多态7.2.2实现多态第50页/共68页第五十页,共69页。51什么什么(shnme)是多态是多态多态性(polymorphism)是一项允许将父对象设置为和一个或多个子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对

23、象的特性以及不同的方式运作。从字面上来理解,多态就是 “多种形式”。在计算机领域,它意味着可以利用(lyng)动态绑定技术,用相同名称的方法来调用方法的不同具体实现。第51页/共68页第五十一页,共69页。527.2.1理解理解(lji)多态多态重载(overload)和多态无关,真正和多态相关的是覆盖(override)。当派生类重新定义了基类的虚拟方法后,基类根据赋给它的不同的派生类引用,动态地调用属于派生类的对应方法,这样的方法调用在编译期间是无法确定的。因此,这样的方法地址是在运行期绑定的(动态邦定)。结论就是 ( jish):重载只是一种语言特性,与多态无关,与面向对象也无关。第52

24、页/共68页第五十二页,共69页。537.2.2实现实现(shxin)多态多态例子:PolymorphismExample.sln当方法前使用了virtual关键字时,它就成为虚拟方法。虚拟方法是多态的基础,在派生类中能够(但不是必须)改变方法的执行,改变基类中虚拟方法的过程叫做覆盖(override)。抽象方法与虚拟方法的区别在于(ziy):虚拟方法有实现,抽象方法没实现抽象方法是隐含的虚拟,而且它必须被子类覆盖第53页/共68页第五十三页,共69页。547.3命名空间命名空间(kngjin)和程序集和程序集在这一部分,我们要在高层次上观察了解(lioji)编译过程。编译器接受源代码文件并生

25、成名称为程序集的输出文件。我们会详细阐述程序集以及它们是如何生成和部署的。还会看到命名空间是如何帮助组织类型的。在我们看到的所有程序中,大部分都是声明并使用它们自己的类。然而,在许多项目中,你会想使用来自其他程序集的类或者类型。这些其他程序集可能来自BCL(BaseClassLibrary),或来自一个第三方卖主,或你自己创建了它们,这些程序集就称为类库,而且它们的程序集文件的名称通常以.dll扩展名结尾而不是.exe扩展名。第54页/共68页第五十四页,共69页。557.3命名空间命名空间(kngjin)和程序集和程序集引用另一个引用另一个引用另一个引用另一个(y )(y )程序集程序集程序

26、集程序集第55页/共68页第五十五页,共69页。567.3命名命名(mngmng)空间和程序集空间和程序集mscorlib库有一个类库,我们几乎先前的每一个示例都使用它。它就是包含Console类的那个库。Console类被定义在mscorlib的程序员集中,在名称为mscorlib.dll的文件里。在这个程序集中,含有(hnyu)C#类型以及大部分.NET语言的基本类型的定义。在编译C#程序时,它必须总是被引用。第56页/共68页第五十六页,共69页。577.3命名空间命名空间(kngjin)和程序集和程序集引用引用引用引用(ynyng(ynyng)类库类库类库类库第57页/共68页第五十七

27、页,共69页。587.3命名空间命名空间(kngjin)和程序集和程序集大家看下图,由于程序(chngx)集Superlib和UltraLib都含有名称为SquareWidget的类的声明,编译器不知道实例化哪一个。这个问题怎么解决呢?第58页/共68页第五十八页,共69页。597.3命名空间命名空间(kngjin)和程序集和程序集如果我们有源代码,我们就可以改变它们的类名来解决这些问题。但是,如果这些类型由不同的公司开发的,而且我们也没有源代码,那怎么办?大家想像一下,在自己做开发的机器上含有不同公司生产(shngchn)的程序集,很可能有一定数量的类名重复。如果你不能把两个程序集用在一个程

28、序中,仅仅因为它们碰巧有相同的类名,这是一种耻辱。但是,命名空间名称帮助我们解决了这个问题。第59页/共68页第五十九页,共69页。607.3命名命名(mngmng)空间和程序集空间和程序集命名空间把一组类型分组在一起并给它们一个名称,称为(chnwi)命名空间名称。下面声明了一个命名空间:namespaceConsoleApplication/yourcode.注意:公司名称可以在命名空间的开始。namespaceNTCSoft.ConsoleApplication/yourcode.第60页/共68页第六十页,共69页。617.3命名空间命名空间(kngjin)和程序集和程序集现在,我们来

29、看一下(yxi)刚才我们遇到的问题。第61页/共68页第六十一页,共69页。627.3命名命名(mngmng)空间和程序集空间和程序集下面是建议的命名空间命名指南:使用公司名开始命名空间名称;在公司名之后跟着技术名称;不要把命名空间命名为与类或类型相同的名称;.NET框架(kunji)BCL提供了数千个已定义的类和类型以供我们在生成自己的程序时选择。为了帮助组织这组有用的功能,相关功能的类型被声明在相同的命名空间里。BCL使用超过100个命名空间来组织它的类型。第62页/共68页第六十二页,共69页。637.3命名命名(mngmng)空间和程序集空间和程序集using指令using命名空间指令

30、通知编译器你将要使用来自某个命名空间的类型。然后你可以继续(jx),并使用简单类名而不必全路径修饰它们。当编译器遇到一个不在当前命名空间的名称时,它检查在using命名空间指令中给出的命名空间列表,并把该未知名称加到列表中的第一个命名空间后面。如果结果完全限定名称匹配了这个程序集或者引用程序集中的一个类,编译器将使用那个类;如果不匹配,那么它试验列表中下一个命名空间。第63页/共68页第六十三页,共69页。647.3命名命名(mngmng)空间和程序集空间和程序集using指令例子(lzi):usingSystem;/命名空间指令.System.Console.WriteLine();/使用完

31、全限定名称.Console.WriteLine();/使用using指令第64页/共68页第六十四页,共69页。精品精品(jn pn)课件!课件!第65页/共68页第六十五页,共69页。精品精品(jn pn)课件!课件!第66页/共68页第六十六页,共69页。第67页/共68页第六十七页,共69页。68感谢您的欣赏(xnshng)!第68页/共68页第六十八页,共69页。内容(nirng)总结1。虽然类只能直接继承一个基类,但继承的层次没有限制。例子:Virtual_override_new.sln。抽象类可以(ky)派生自另一个抽象类。静态类用于分组不受实例数据影响的数据和函数。如果有源代码改源代码。编译器接受源代码文件并生成名称为程序集的输出文件。如果我们有源代码,我们就可以(ky)改变它们的类名来解决这些问题。现在,我们来看一下刚才我们遇到的问题。下面是建议的命名空间命名指南:。感谢您的欣赏第六十九页,共69页。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号