本帖最后由 曹伟 于 2013-9-17 17:47 编辑
之前蔡蔡问我说说“里氏转换”,我懵了,没听说过这个名词耶,今天抽空整理学习一下!- namespace ConsoleApplication1
- {
- class Person
- {
- private string name;
- private int age;
- private char gender;
- public Person(string name, int age, char gender)
- {
- this.name = name;
- this.age = age;
- this.gender = gender;
- }
- public void Say()
- {
- Console.WriteLine("大家好,我是{0},今年{1}岁了,我是{2}生", name, age, gender);
- }
- public string Name { get { return this.name; } }
- public int Age { get { return this.age; } }
- public char Gender { get { return this.gender; } }
- }
- class Student : Person
- {
- private string hobby;
- public Student(string name, int age, char gender, string hobby) : base(name, age, gender)
- {
- this.hobby = hobby;
- }
- public void SayHello() {
- Console.WriteLine("大家好,我是{0},今年{1}岁,我是{2}孩,我的爱好是{3}", Name, Age, Gender, hobby);
- }
- public string Hobby { get { return this.hobby; } }
- }
- class Teacher : Person
- {
- private int yearsOfService;
- public Teacher(string name, int age, char gender, int yearsOfService) : base(name, age, gender)
- {
- this.yearsOfService = yearsOfService;
- }
- public void SayHello()
- {
- Console.WriteLine("大家好,我是{0},我已经工作{1}年了", Name, yearsOfService);
- }
- public int YearsOfService { get { return this.yearsOfService; } }
- }
- class Program
- {
- /*
- 面向对象编程就是,找到对象,调用方法,完成需要的事情.
- 那么现在有一个场景:
- 有一个父类Person和两个子类Student与Teacher,
- 在Main方法中有3个对象,分别是Person对象、Student对象和Teacher对象.
- 那么现在想要用一种数据类型将其储存起来,就像数组一样可以统一管理,该如何是好呢?
- 这里就需要考虑里氏转换了. 换句话说:里氏转换就是为了处理类型一致而存在的
- 里氏转换的两条:
- 1、子类可以直接赋值给父类
- 2、父类若指向子类,那么可以强制转化为该子类
- */
- static void Main(string[] args)
- {
- Person person1 = new Person("张三",18,'男');
- Teacher teacher1 = new Teacher("李四",45,'男',20);
- Student student1 = new Student("王五",19,'男',"打篮球");
- Person[] persons = { person1, teacher1, student1 };
- for (int i = 0; i < persons.Length; i++)
- {
- persons.Say(); //这里由于都是Person对象,因此只能访问Person对象的方法(类型决定能访问什么成员)
- }
- //将子类赋值给父类对象,那么子类对象就变成了父类对象了,
- //而原来那些子类的特征与方法难道就丢失了吗?
- //我们知道类型决定能访问什么成员,因此想要调用子类的方法,
- //就必须再将子类转换回来. 这里便是里氏转换的第二句话:
- //如果父类对象指向的是一个子类对象,
- //那么该父类对象可以强制转化为这个子类对象
- Console.WriteLine("===============================");
- Person person2 = student1;
- person2.Say();
- Student student2 = person2 as Student; //能转换则转换,不能转换返回null
- if(student2!=null)
- {
- student2.SayHello();
- }
- Console.ReadLine();
- }
- }
- }
复制代码 参考:http://wenku.baidu.com/view/988bf614a2161479171128b9.html
|