《c_05-面向对象编程(二)继承封装和多态》-精选课件(公开PPT)

上传人:zhuma****mei2 文档编号:136074725 上传时间:2020-06-23 格式:PPT 页数:29 大小:149KB
返回 下载 相关 举报
《c_05-面向对象编程(二)继承封装和多态》-精选课件(公开PPT)_第1页
第1页 / 共29页
《c_05-面向对象编程(二)继承封装和多态》-精选课件(公开PPT)_第2页
第2页 / 共29页
《c_05-面向对象编程(二)继承封装和多态》-精选课件(公开PPT)_第3页
第3页 / 共29页
《c_05-面向对象编程(二)继承封装和多态》-精选课件(公开PPT)_第4页
第4页 / 共29页
《c_05-面向对象编程(二)继承封装和多态》-精选课件(公开PPT)_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《《c_05-面向对象编程(二)继承封装和多态》-精选课件(公开PPT)》由会员分享,可在线阅读,更多相关《《c_05-面向对象编程(二)继承封装和多态》-精选课件(公开PPT)(29页珍藏版)》请在金锄头文库上搜索。

1、第五讲 面向对象编程(二) 继承、封装和多态,4.3 继承、封装和多态,4.3.1 继承 4.3.2 封装 4.3.3 多态 4.3.4 this和base关键字,4.3.1 类的继承,继承的意思是一个类可以建立在另一个类的基础上,可以继承另一个类的属性和方法。我们把被继承的类叫做基类,通过继承产生的类叫做派生类(也可以叫做父类和子类)。继承的概念来源与现实的生活,比如汽车、轮船、火车飞机等就是继承于交通工具这个类,而汽车类中又可以派生出新的类,比如轿车、面包车等等。 引入继承可以让我们重用以前写过的代码,新编写的代码可以在原来的基础上继承而来。 在C#中继承的方式就是定义派生类。 在C#中,

2、所有的类都是通过直接或间接地继承Object类得到的。,1. 派生子类,定义派生类的基本形式: class 派生类名字:基类名字 派生类的代码; ,public class Parent public Parent( ) .定义一个构造函数 public void WriteItem( ) .定义方法 public class Child:Parent public Child( ) . 派生类的构造函数 public static void Main( ) Child a=new Child( ); a.WriteItem( ); ,派生类使用基类的方法,基类的构造函数先执行再执行派生类的构

3、造函数。,2. 域的继承、添加与隐藏,1、域的继承:子类可以继承父类的所有成员。但注意虽然派生类继承了私有成员,但除定义类外,派生类不能直接访问基类的所有私有成员。 2、域的添加:在子类定义中加上新的域变量,就可以使得子类具有比父类多的属性。如: class Student: Person string school; int score; 子类比父类多了两个成员: school、score。 3、域的隐藏:子类重新定义一个从父类中继承的域变量,但通常会被认为是一个糟糕的设计。 class A public int a; class B:A new public int a;,使用new修饰符

4、来隐藏父类的同名成员a。,下面是一个演示隐藏域的例子,注意由于要在派生类B中调用 父类的构造函数,所以A的构造方法必须用public修饰。 class A public int a; public A() a = 1; class B : A new public double a; B()a=1.5; static void Main() B b1 = new B(); Console.WriteLine(b1.a); Console.ReadLine(); ,3. 方法的继承、添加与覆盖,1、方法的继承:子类可以继承父类的所有方法。 2、方法的添加:在子类定义中加上新的方法,以针对子类实现

5、相应的功能。 3、方法的覆盖:子类定义与父类同名的方法。(多态之一) (1)定义同名但参数列表不同的方法,称为方法的重载; (2)定义同名且参数列表也相同的方法,称为新增,这时应 该在同名方法前面用new修饰符; (3)定义同名且参数列表也相同的方法,并且父类中的方法用abstract/virtual进行修饰,子类中的方法用override进行了修饰,称为虚方法的覆盖。,方法重载举例,class parent public int add( int x,int y ) return(x+y); class child : parent public int add(int x, int y,

6、int z) return (x + y + z); public static void Main() child c1 = new child(); Console.WriteLine(c1.add(1, 2, 3); Console.WriteLine(c1.add(4, 5); Console.ReadLine(); ,分别使用了自己和父类的方法。,方法隐藏举例,class parent public int add( int x,int y ) return(x+y); class child:parent new public int add(int x,int y) return

7、(x+y+10); public static void Main( ) child c1=new child( ); c1.add(4,5); ,使用了自己的方法。,虚方法覆盖举例,using System; class one public virtual void y() Console.WriteLine(one_y); class two : one public override void y() /重写同名方法 Console.WriteLine(two_y); ,class test public static void Main() two two1= new two();

8、one one1 = two1; one one2 = new one(); /m1指向m2实例 two1.y(); one1.y(); one2.y(); Console.ReadLine(); ,虽然new和vitrual关键字都可以在子类中声明与父类同名 的方法,但细节不太相同。 上例中我们看到在把父类指向子类后,virtual虚方法会自动 调用子类中override的新方法。而在子类中用new隐藏了的方法 还存在,还是可以被父类调用。即override是彻底覆盖了原来的 方法,而new只是隐藏了原来的方法。 new虽然可以隐藏原来的方法,但不是良好的设计,因为 基类(父类)的设计者可能

9、不想该方法会在任何子类中被重载 ,而如果设计者加上了vitrual关键字,说明他考虑到了该方法 可以被子类重载。,4.3.2 类的封装,类的封装改变了用户传统的使用数据和代码的方式,它将方法和数据包含在一起构成一个独立的单元,可以通过设定单元内各个成员的的特性来控制对成员的访问。比如将一个字段定义为private,就可以防止外界直接访问这个字段。 封装一个类由两种做法: 1)为一个私有类成员定义公共读方法和写方法; 2)使用属性,用set和get访问器。 下面看一个使用第一种方法的例子:,public class Student private string studentname; publ

10、ic string getstudentname( ) return (studentname); public void setstudentname(string na) studentname=na; ,class App public static void Main( ) Student s1=new Student( ); s1.setstudentname(zhanghua); Console.WriteLine(s1.getstudentname( ); Console.ReadLine(); ,不能使用语句 s1.studentname=“zhanghua”;,4.3.3 多

11、态,多态指的是定义具有不同功能但相同名称的方法或属性的多个类的能力。C#中的多态可以由虚方法实现。 对于非虚方法,其实现是不变的,无论由基类实例调用还是由派生类实例调用都是相同的;而虚方法的实现可以由派生类取代,取代的过程称为重写。重写可以取代从基类继承的虚方法,但原虚方法的可访问性不能改变,静态方法和非虚方法不能被重写。 基类 public virtual void Show( ) . 派生类 public override void Show( ) . ,虚方法重写举例:定义基类圆形Round,有一个成员半径,编写构造函数和计算面积的虚方法Area( );再定义一个派生类球形Sphere,

12、对虚方法Area进行重写。,class Round public double r=2; public virtual double Area() return (3.14 * r * r); class Sphere : Round public override double Area() return (3.14 * r * r * r); ,class App static void Main() Sphere s = new Sphere(); Round r1 = s; Round r2 = new Round(); Console.WriteLine(s.Area(); Cons

13、ole.WriteLine(r1.Area(); Console.WriteLine(r2.Area(); Console.ReadLine(); ,1. this关键字,this关键字的作用是引用调用方法的当前实例,它可以从构造函数、实例方法和实例访问器中访问成员。 用法一:使用this来访问域和方法 void sayHello( ) Console.WriteLine(“My name is”+name); 与以下方法相同 void sayHello( ) Console.WriteLine(“My name is”+this.name); 用法二:解决局部变量或参数与域同名问题 publ

14、ic Student(string name,string number) this.name=name; this.number=number;,4.3.4 this和base关键字,this关键字举例,public class Student public string name; public string number; public double subsidy=180; public Student(string name ,string number) this.name=name; this.number=number; public void ShowInfo( ) Cons

15、ole.WriteLine(0n1,name,number); Console.WriteLine(0,AdvSubsidy.Caculate(this); ,public class AdvSubsidy public static double Caculate(Student E) return(1.5*E.subsidy); public class AppMain public static void Main( ) Student s1=new Student(zhanghua,200454240); s1.ShowInfo( ); Console.ReadLine(); ,this的注意事项,this指的是调用的“对象”本身 (1)通过this不仅可以引用该类中定义的域和方法,还可以引用该类的父类中定义的域和方法; (2)在static静态方法中,不能使用this关键字。,虚方法中的例子,也可以用this改写如下: using System; class Round

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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