5 面向对象编程进阶

上传人:野鹰 文档编号:2844929 上传时间:2017-07-28 格式:PPT 页数:60 大小:691KB
返回 下载 相关 举报
5 面向对象编程进阶_第1页
第1页 / 共60页
5 面向对象编程进阶_第2页
第2页 / 共60页
5 面向对象编程进阶_第3页
第3页 / 共60页
5 面向对象编程进阶_第4页
第4页 / 共60页
5 面向对象编程进阶_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《5 面向对象编程进阶》由会员分享,可在线阅读,更多相关《5 面向对象编程进阶(60页珍藏版)》请在金锄头文库上搜索。

1、第4章 面向对象编程进阶,教学要求掌握类的继承与多态掌握操作符的重载基本掌握类型转换理解结构与接口的含义了解集合与索引器理解异常处理理解并掌握委托与事件了解预处理命令、组件与程序集教学重点类的继承与多态操作符的重载委托与事件教学难点多态与接口的含义 委托与事件学时分配:8+8,教学内容,类的继承与多态操作符的重载基掌握类型转换结构与接口集合与索引器异常处理委托与事件预处理命令组件与程序集,类的继承与多态,当今的面向对象编程语言都提供了继承和多态的功能,C#作为一种面向对象的高级编程语言也具有这样的特点。继承是面向对象语言的基本特征,是实现代码复用的手段。继承使得在原有的类基础之上,对原有的程序

2、进行扩展,从而提高程序开发的速度,实现代码的复用。同一种方法作用于不同对象可以产生不同的结果,这就是多态性。它是在基类中使用虚方法,在其派生类中使用重载实现的。,继承,继承是自动地共享类、子类和对象中的方法和数据的机制,类与类之间通过继承关系组成的层次结构。以原有的类为基础产生新类,即从原有的类派生出新类。在这个过程中原有的类称为基类(超类或父类),新类称为派生类(子类)。汽车类派生出卡车类。在此过程中,我们称汽车类为基类,卡车类为汽车类的派生类。面向对象程序设计提供了类的继承机制,它描述类与类之间的IS-A关系,该机制自动的为派生类提供了其基类的操作和属性。国光苹果是一种苹果,苹果是一种水果

3、。猫是一种猫科动物,猫科动物是一种哺乳动物。一个类可以有多个子类,也可以有多个父类。C#限制一个类至多只能直接继承一个类(单一继承,树结构),但对接口可以直接继承多个类(多重继承,网状结构)继承的作用:扩充现有的类来构造新类(子类);组合现有的类来构造新类(父类,通过接口来实现);类型替换原则:如果B继承A,则所有要求对象为A类型的地方都可以用B类型的对象来替换;提高了代码的重用率,继承的语法,类访问修饰符class 子类名:父类名 /成员变量,同一般类的定义 /成员函数,同一般类的定义 ;类成员的访问性:主要是指外部对它的访问权限public:成员可以从任何代码访问。protected:成员

4、只能从派生类的内部访问。internal:成员只能从同一程序集的内部访问。protected internal:成员只能从同一程序集内的派生类访问。 private:成员只能在当前类的内部访问。继承成员的访问控制规则由父类成员的访问控制方式和继承访问控制方式共同决定private+public(internal)=不可访问pubic+public (internal) =public(internal)protected+ public (internal) =protectedinternal + public (internal) = internalprotected internal

5、+ public (internal) = protected internal,继承要遵循的规则,继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员同样也继承了A中的成员派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义构造函数和析构函数不能被继承,除此以外的其他成员不论对它们定义了怎样的访问方式,都能被继承,基类中成员的访问方式只能决定派生类能否访问它们。派生类如果定义了与继承而来的成员同名的的新成员,就可以覆盖(重写)已继承的成员,但这并不意味着派生类删除了这些成员,只是不能再访问这些成员类可以定义虚方法、虚属性,以及虚索引指示

6、器,派生类能够重载这些成员,从而实现类的多态性在执行派生类的构造函数代码之前,基类的构造函数被调用了,即基类在派生类初始化之前自动进行初始化。这意味着,构造函数代码实际上是自上向下执行的,而大多数派生类代码则是最后执行。,使用继承,继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。使用继承而产生的类被称为派生类或者子类,而被继承的类则称为基类、超类或父类。客观世界中的许多事物之间往往都是具有相同的特征,具有继承的特点。,继承举例,例:类的继承。using System;/定义基类Shapepublic class Shape protecte

7、d string Color;public Shape() ;public Shape(string Color) this.Color = Color;public string GetColor() return Color; /定义Circle类,从Shape类中派生public class Circle : Shape private double Radius;public Circle(string Color, double Radius) this.Color = Color; this.Radius = Radius;public double GetArea() retur

8、n System.Math.PI * Radius * Radius;,继承举例,/ 派生类Rectangular,从Shape类中派生public class Rectangular:Shapeprotected double Length, Width;public Rectangular() Length=Width=0;public Rectangular(string Color,double Length, double Width)this.Color = Color;this.Length = Length; this.Width = Width;public double A

9、reaIs() return Length*Width; public double PerimeterIs()/周长return (2*(Length+Width);/ 派生类Square,从 Rectangular类中派生public class Square: Rectangularpublic Square(string Color,double Side) this.Color = Color; this.Length=this.Width = Side;,继承举例,public class TestInheritancepublic static void Main() Circl

10、e Cir= new Circle(orange,3.0); Console.WriteLine(Circle color is 0,Circle area is 1, Cir.GetColor(),Cir.GetArea(); Rectangular Rect= new Rectangular(red,13.0, 2.0); Console.WriteLine(Rectangualr color is 0,Rectangualr area is 1, Rectangular perimeter is 2, Rect.GetColor(),Rect.AreaIs(), Rect.Perimet

11、erIs();Square Squ= new Square(green,5.0);Console.WriteLine(Square color is 0,Square Area is 1, Square perimeter is 2, Squ.GetColor(),Squ.AreaIs(), Squ.PerimeterIs();,继承base关键字,可以在派生类的构造函数定义语句之后加上base(形参),表示当对派生类对象实例化时,调用的是基类的对应构造函数;若无形参,则调用基类的无参构造函数。public class Square: Rectangular public Square(str

12、ing Color,double Side):base(Color,Side,Side) ; 调用基类的方法:base.基类方法名,继承中的构造函数与析构函数,在前面讨论过派生类的构造函数会隐式调用父类的无参构造函数。那么,如果父类也是派生于其它类,会是什么样的情形呢?C#的执行顺序是这样的:根据层次链找到最顶层的基类,先调用基类的构造函数,再依次调用各级派生类的构造函数。而析构函数的次序正好相反。,继承与System.Object类,C#所有类都派生于System.Object类。在定义类时如果没有指定派生于哪一个类,系统就默认其派生于Object类。public class Shape 等

13、同于public class Shape :System.Object System.Object类常见的公有方法是Equals:如果两个对象具有相同值时,方法将返回true。GetHashCode:方法返回对象的值的散列码。ToString:通过在派生类中重写该方法,返回一个表示对象状态的字符串。,多态,多态也是面向对象语言的基本特征之一,是指在程序执行之前无法根据函数名和参数确定调用哪一个操作,而是程序执行过程中,根据实际运行情况动态确定,从而带来编程高度的灵活性。实现多态的方法是使用虚方法。虚方法的重载:在类的方法前加上关键字virtual, 则该方法被称为虚方法。通过对虚方法的重载,实

14、现在程序运行过程中确定调用的方法。需要注意的是这里所讲的重载与第3章所讲的通过参数类型与参数个数的不同实现的重载含义是不同的。,虚方法举例,例:虚方法的重载。using System;class Apublic void F() Console.WriteLine(A.F); public virtual void G() Console.WriteLine(“A.G”); /虚方法class B: Anew public void F() Console.WriteLine(B.F); public override void G() Console.WriteLine(B.G); clas

15、s Teststatic void Main() B b = new B();A a = b;a.F();/a.Fb.F();/b.Fa.G();/b.Gb.G();/b.G,多态,抽象类与抽象方法:抽象类是一种特殊的基类,并不与具体的事物联系。抽象类的定义使用关键字abstract。抽象类是不能被实例化,它只能作为其它类的基类。将Shape类定义为抽象类:public abstract class Shape 在抽象类中也可以使用关键字abstract定义抽象方法,要求所有的派生非抽象类都要重载实现抽象方法。引入抽象方法的原因在于抽象类本身是一种抽象的概念,有的方法并不要具体的实现,而是留下来让派生类来重载实现。Shape类中GetArea方法本身没什么具体的意义,而只有到了派生类Circle类和Rectangular才可以计算具体的面积。抽象方法写法:public abstract double GetArea();则派生类重载实现为:public override double GetArea() ,

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

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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