您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > C# 学习 第5章 继承性、多态性和命名
第5章继承性、多态性和命名空间继承性(inheritance)和多态性(polymorphism)是面向对象的重要机制,其提高了软件模块的可复用性和可扩充性。在第4章中已经介绍了面向对象的另一特性:接口。本章除介绍继承外,将介绍了两种C#中的重要概念抽象类和密封类,它们显示了C#语言的多态性。这一章的主要内容如下:面向对象的继承和多态机制类型的转换程序的异常处理命名空间第5章继承性、多态性和命名空间继承性(inheritance)和多态性(polymorphism)是面向对象的重要机制,其提高了软件模块的可复用性和可扩充性。在第4章中已经介绍了面向对象的另一特性:接口。本章除介绍继承外,将介绍了两种C#中的重要概念抽象类和密封类,它们显示了C#语言的多态性。这一章的主要内容如下:面向对象的继承和多态机制类型的转换程序的异常处理命名空间5.1继承机制面向对象的重要机制之一继承是可以使用以前建造类的方法和属性。通过简单的程序代码来建造功能强大的类,不仅会节省很多编程时间,而且还可以减少代码出错的机会。5.1.1继承的概念5.1.2继承的机制子类对象中的成员变量的初始化实过程如下:(1)分配成员变量的存储空间,并进行默认的初始化。(2)绑定构造函数参数,就是把newPerson(实际参数列表)中所传递进的参数赋值给构造函数中的形式参数变量。(3)如果有this()调用,则调用相应的重载构造方法。(4)显式或隐式追溯调用父类的构造方法。(5)进行实例变量的显式初始化操作,也就是执行定义成员变量时就进行赋值的语句。(6)执行当前构造函数体中的代码。5.2多态性在面向对象的系统中,多态性允许对一个对象进行操作,由一个对象完成一系列的动作,具体实现哪个动作由系统负责解释。在C#中,多态性的定义是:同一操作作用于不同的类的实例,不同类将进行不同的解释,最后产生不同的执行结果。其支持两种类型的多态性:编译时多态性和运行时多态性。编译时多态性是通过重载来实现的,其根据传递的参数、返回的类型等信息决定实现何种操作。在第4章已经介绍了。运行时多态性是指直到系统运行时,才根据实际情况决定实现何种操作,其是通过虚方法来实现的。5.2.1虚方法虚方法是通过在方法声明语句的访问修饰符和返回类型之间放置virtual关键字来实现的。当调用虚方法时,运行将确定调用对象是什么类的实例,并调用适当的覆盖方法,通过override关键字来覆盖。5.2.2抽象类和抽象方法抽象方法可以看成是没有方法体的虚方法。其是必须被派生类覆盖的方法。在C#中是通过关键字abstract来实现的。如果类的任何一个方法都是抽象的,则该类也必须声明为抽象的。抽象类的用途是提供多个派生类可共享的基类的公共定义,并使用abstract关键字定义。先定义一个抽象类:abstractclassMyClass{}5.2.3抽象方法抽象类中可以定义抽象方法,如果一个方法要声明为抽象方法,则方法前加上abstract修饰符即可。抽象方法是一个新的虚方法,它不提供具体的方法实现代码。只能在抽象类中声明抽象方法,对抽象方法,不能使用static或virtual修饰符,而且方法中不能有任何可执行代码,只要给出方法的原型就可以了。5.2.4密封类和密封方法与override关键字连用的还有sealed关键字,sealed关键字用来表示密封的意思。在C#中,密封类的作用是限制扩展性和灵活性。先定义一个简单的密封类:sealedclassMyClass{}5.2.5方法的隐藏【范例5-8】还有一种方法可以实现在派生类中的覆盖,即new关键字。这种过程叫做方法的隐藏。但是,派生类和非抽象类的基类方法必须有相同的方法。5.3类型的转换第3章讲述了基本数据类型变量的类型转换问题,其实对象类型转换也差不多是一个道理。不过在处理对象之前,有时候还经常对变量的类型进行判断,所以下面从类型的判断开始。5.3.1is关键字is关键字可以检查对象是否与特定的类型兼容。显然,可以用它来判断对象是否为给定的类型。定义格式为:operandistype在上述定义中,当type是一个类,而operand也是该类型、或继承了该类型、或封箱到该类型中时结果为true;当type是一个接口类型,而operand也是该类型,或者执行该接口的类型结果也为true;当type是一个值类型,而operand也是该类型,或者被拆箱到该类型中时结果也为true。5.3.2转换机制值类型和引用类型的根本区别在于在内存中的存储方式,值类型总是在内存中的栈中存储,而引用类型却是在堆栈中存储。堆栈与栈的区别在于,当定义一个值类型变量时,会在栈中分配适当大小的内存,内存中的这个空间用来存储变量所含的值。引用变量也利用栈,但这时栈包含的知识对另一个内存位置的引用,而不是实际值。这个位置是堆中的一个地址。值类型代表基本数据类型,分为3种简单类型(基本数据类型)、结构(用户定义的值类型)和枚举。而引用类型分为类、接口、数组和委托。在第2章已经介绍了值类型间的显示转换和隐式转换。这一小节中,将介绍引用类型间的转换。5.3.3as关键字as关键字用于在兼容的引用类型之间执行转换,把一种类型转换为指定的引用类型。与强制转换不同as关键字并不会引发错误。其基本格式为:operandastype当operand的类型是type类型、operand的类型可以隐式转换为type类型、operand的类型可以封箱到类型type类型时,operand的类型就会被转换为相应type类型,否则operand的类型会被赋予null。5.3.4封箱(boxing)和拆箱(unboxing)第2章讨论了值类型间的转换,而上面的小节讨论了引用类型间的转换,同时介绍了两者间的区别。封箱(boxing)和拆箱(unboxing),就是在任何值类型、引用类型和object类型间进行转换。1.封箱(boxing)2.拆箱(unboxing)5.4异常处理C#语言支持错误处理和异常(exception)。异常处理是捕获预期的和突发事件的技术,其目的是在错误发生之前,能够事先预料错误,使程序更可靠。异常定义了程序中遇到的非致命的错误,而不是编译时的语法错误。5.4.1异常处理基础异常用来表示在应用程序执行期间执行间的错误,以及其他意外行为。当遇到下列情况时,可能会引发异常:操作资源不可用。公共语言运行库遇到意外情况。自定义抛出异常。在.NETFramework中,类Exception类表示基类异常,其他异常从其继承而来。该类常用的属性有StackTrace属性,InnerException属性,Message属性,HelpLink属性,Data属性,Source属性和TargetSite属性。5.4.2异常的捕获5.4.3throws关键字【范例5-14】在异常处理中,还有一个throws关键字,其作用也非常重要。为了详细的了解该关键字,请从代码5-22开始讲解。5.4.4finally关键字【范例5-17】在try……catch语句后,还可以有一个finally语句,finally语句中的代码块不管异常是否被捕获总是要执行的,代码5-25演示了该关键字的使用。5.4.5异常的使用细节当使用异常的时候,必须注意:一个方法被覆盖时,覆盖它的方法必须抛出异常或异常的子类。如果父类抛出多个异常,那么覆盖方法必须抛出那些异常的一个子集,也就是说,不能抛出新的异常。5.5命名空间微软公司为程序开发人远提供了成千上万的类组成类库,如果不对这些类进行分门别类的使用和存放,就会像开发人员不用文件夹去管理众多的文件一样,在使用的时候不仅极度困难和不方便,也极易出现类的命名冲突问题。在C#中是通过引入命令空间机制,提供类的多层类命名空间,来解决上述问题。5.5.1声明命名空间命名空间是C#类、接口、委托、枚举和其他类型的一个逻辑上的组合。其不仅在使用上灵活了很多,而且还解决了类型之间的命名冲突。命名空间是一种逻辑组合,而不是物理组合。其声明的基本格式:namespacequalified-identifiernamespace-body;5.5.2导入命名空间5.5.3使用指示符使用指示符的目的是为了方便使用其他的命名空间中定义的命名空间和类型。其有两种类型:别名使用指示符和命名空间使用指示符。命名空间使用指示符在上一小节已经介绍。别名使用指示符定义了一个别名,以后可以使用这个别名来代替一个类型。这在两个库的名字可能发生冲突的情况下非常有用。别名还可以避免使用冗长的命名空间。其基本格式如下:usingMS=MyProgram.MyCSharp.Chap05;5.6小结本章接着上一节的内容继续介绍面向对象,主要内容是面向对象的继承性、多态性、封装性,同时还有在编程中经常遇到的类型转换、异常处理、命令空间。面向对象的3大特征虽然解释起来很简单,但是要融会贯通却很难,读者千万不要被它们的假象所迷惑。后面的3个概念虽然看起来很陌生,但是学起来非常简单。因此,读者要把重心放在前3小节中。
本文标题:C# 学习 第5章 继承性、多态性和命名
链接地址:https://www.777doc.com/doc-4427910 .html