C#程序设计 第3章C#面向对象编程
C# 程序设计 第3章 C#面向对象编程
派生类和基类的转换 ■可以将一个派生类型直接赋值给一个基类型 ■通过该基类型可以访问父类,子类非私有成员 Manager mng=new Manager("王军",45,4000,3758.26); Employee emp=mng; emp.Display(); 执行的是子类的Display(0方法 emp.Bonus=908;/编译阳饫
2 派生类和基类的转换 ▪ 可以将一个派生类型直接赋值给一个基类型 ▪ 通过该基类型可以访问父类,子类非私有成员 Manager mng = new Manager("王军", 45, 4000, 3758.26); Employee emp = mng; emp.Display( ); emp. Bonus=908;//编译错误 执行的是子类的Display()方法
基本内容 方法的隐藏 方法的重写 抽象类和抽象方法 密封类和密封方法 嵌套类 分部类
3 基本内容 方法的隐藏 密封类和密封方法 嵌套类 方法的重写 抽象类和抽象方法 分部类
方法的隐藏 输出:学生的学号。 public class Person public class Student:Person 隐藏 public void Getlnfo() public new void GetInfo() { Console.WriteLine("name:"+name ) Console.WriteLine("studentID:"+studentID); Console.WriteLine("age:"+age); } Person per new Person("person",50); name:person per.Getlnfo(); age:50 Student stu new Student("student",20,"201209"); stu.Getlnfo(); studentID:201209 继承是子类使用父类的方法
4 方法的隐藏 Person per = new Person("person",50); per.GetInfo(); Student stu = new Student("student",20,"201209"); stu. GetInfo(); name: person age:50 studentID:201209 继承是子类使用父类的方法 输出:学生的学号。 隐藏
方法的隐藏 ■ 如何隐藏父类的方法? ·使用关键字new来覆盖方法(隐藏方法) ·不加new关键字,也认为是方沙 如何使得父类变量被赋值 为子类实例时,调用的是 ·类或结构中的常量、字段、属 子类的方法? 成员 不可以与overridel同用 使用new隐藏父类方法时 s=singer; 我是一个明星 s.Introduce(); 5
5 方法的隐藏 ▪ 如何隐藏父类的方法? ◼ 使用关键字new来覆盖方法(隐藏方法) ◼ 不加new关键字,也认为是方法隐藏,但编译会产生警告 ◼ 类或结构中的常量、字段、属性、方法隐藏基类中的同名 成员 ◼ 不可以与override同用 使用new隐藏父类方法时 s=singer; s.Introduce(); 我是一个明星 如何使得父类变量被赋值 为子类实例时,调用的是 子类的方法?
基本内容 方法的隐藏 方法的重写 抽象类和抽象方法 密封类和密封方法 嵌套类 分部类
6 基本内容 方法的隐藏 密封类和密封方法 嵌套类 方法的重写 抽象类和抽象方法 分部类
什么是多态 用刀叉 ■ 吃饭 用筷子 用手抓 > 同样一件行为(吃饭),但表现的形式却是不同的,这 就是生活中的多态。 > 这种不同类型的对象对于同一方法表现出了不同的行 为的方式就是多态。 继承是子类使用父类的方法,而多态则是父类使用子类的方法
7 什么是多态 ➢ 同样一件行为(吃饭),但表现的形式却是不同的,这 就是生活中的多态 。 ➢ 这种不同类型的对象对于同一方法表现出了不同的行 为的方式就是多态 。 分析 ▪ 吃饭 用刀叉 用筷子 用手抓 继承是子类使用父类的方法,而多态则是父类使用子类的方法
虚方法和方法重写 ■ 重写方法 ■在基类中使用关键字virtual定义虚方法 ■派生类中使用关键字override来重写方法 可用于方法、属性、索引器、事件 丕能和static、abstract、override、privat e同用 public viruar vo Console.WriteLine("姓名:{0},年龄:{1,工资:2",name,Age,salary); } public override void Display() base.Display(); Console.WriteLine("津贴是:{O}",this.Bonus)月 } 8
8 虚方法和方法重写 ▪ 重写方法 ◼ 在基类中使用关键字 virtual定义虚方法 ◼ 派生类中使用关键字 override来重写方法 可用于方法、属性、索引器、事件 不能和static、abstract、override、privat e同用
关于重写 如果一个基类的方法声明为虚函数,任何继承该虚函数的 子类可以声明override方法重写它 ■子类重写的方法必须和父类的虚函数有相同的签名 ■override不能改变基类虚函数的访问权限 ■override不能和static、virtual、.new同用 ·被重写的方法必须是virtual或abstracti或override override用于扩展或修改继承的且声明为abstracti或 virtual的方法、属性、索引器、事件 public override void Display() { 可以通过base调用继承的基类的虚函数 base Display0: Console.WriteLine("津贴是:{0}",this.Bonus);
9 关于重写 ▪ 如果一个基类的方法声明为虚函数,任何继承该虚函数的 子类可以声明override方法重写它 ▪ 子类重写的方法必须和父类的虚函数有相同的签名 ▪ override不能改变基类虚函数的访问权限 ▪ override不能和static、virtual、new同用 ▪ 被重写的方法必须是virtual或abstract或override ▪ override用于扩展或修改继承的且声明为abstract或 virtual的方法、属性、索引器、事件 public override void Display() { base.Display(); Console.WriteLine("津贴是:{0}",this .Bonus ); } 可以通过base调用继承的基类的虚函数
重写和隐藏的区别 同一个子类对象实例 通过子类引用执行的是子类的版本 ▣隐藏 通过父类引用执行的也是父类的版本 。重写 通过子类引用执行的是子类的版本 通过父类引用执行的也是子类的版本 字段 ■可以使用new隐藏,但不能设置为virtual ■子类特有的成员 ■不能通过父类来引用 10
10 重写和隐藏的区别 ▪ 同一个子类对象实例 ◼ 隐藏 ◼ 重写 ▪ 字段 ◼ 可以使用new隐藏,但不能设置为virtual ▪ 子类特有的成员 ◼ 不能通过父类来引用 通过子类引用执行的是子类的版本 通过父类引用执行的也是父类的版本 通过子类引用执行的是子类的版本 通过父类引用执行的也是子类的版本