A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹伟 中级黑马   /  2013-9-17 11:03  /  2809 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曹伟 于 2013-9-17 17:47 编辑

之前蔡蔡问我说说“里氏转换”,我懵了,没听说过这个名词耶,今天抽空整理学习一下!
  1. namespace ConsoleApplication1
  2. {
  3.     class Person
  4.     {
  5.         private string name;   
  6.         private int age;  
  7.         private char gender;   
  8.         public Person(string name, int age, char gender)
  9.         {  
  10.             this.name = name;
  11.             this.age = age;  
  12.             this.gender = gender;
  13.         }  
  14.         public void Say()
  15.         {   
  16.             Console.WriteLine("大家好,我是{0},今年{1}岁了,我是{2}生",   name, age, gender);  
  17.         }   
  18.         public string Name {  get {   return this.name;  } }  
  19.         public int Age {  get {   return this.age;  } }
  20.         public char Gender {  get {   return this.gender;  } }
  21.     }
  22.     class Student : Person
  23.     {
  24.         private string hobby;
  25.         public Student(string name, int age, char gender, string hobby) : base(name, age, gender)
  26.         {
  27.             this.hobby = hobby;
  28.         }
  29.         public void SayHello() {
  30.             Console.WriteLine("大家好,我是{0},今年{1}岁,我是{2}孩,我的爱好是{3}", Name, Age, Gender, hobby);
  31.         }
  32.         public string Hobby {  get {   return this.hobby;  } }
  33.     }
  34.     class Teacher : Person
  35.     {
  36.         private int yearsOfService;  
  37.         public Teacher(string name, int age, char gender, int yearsOfService)   : base(name, age, gender)
  38.         {  
  39.             this.yearsOfService = yearsOfService;
  40.         }
  41.         public void SayHello()
  42.         {
  43.             Console.WriteLine("大家好,我是{0},我已经工作{1}年了", Name, yearsOfService);  
  44.         }  
  45.         public int YearsOfService {  get {   return this.yearsOfService;  } }

  46.     }
  47.     class Program
  48.     {
  49.         /*
  50.         面向对象编程就是,找到对象,调用方法,完成需要的事情.
  51.         那么现在有一个场景:
  52.         有一个父类Person和两个子类Student与Teacher,
  53.         在Main方法中有3个对象,分别是Person对象、Student对象和Teacher对象.
  54.         那么现在想要用一种数据类型将其储存起来,就像数组一样可以统一管理,该如何是好呢?
  55.         这里就需要考虑里氏转换了. 换句话说:里氏转换就是为了处理类型一致而存在的
  56.         里氏转换的两条:
  57.         1、子类可以直接赋值给父类
  58.         2、父类若指向子类,那么可以强制转化为该子类
  59.          */
  60.         static void Main(string[] args)
  61.         {

  62.           Person person1 = new Person("张三",18,'男');   
  63.           Teacher teacher1 = new Teacher("李四",45,'男',20);   
  64.           Student student1 = new Student("王五",19,'男',"打篮球");
  65.           Person[] persons = { person1, teacher1, student1 };

  66.           for (int i = 0; i < persons.Length; i++)
  67.           {
  68.               persons.Say();  //这里由于都是Person对象,因此只能访问Person对象的方法(类型决定能访问什么成员)
  69.           }

  70.           //将子类赋值给父类对象,那么子类对象就变成了父类对象了,
  71.           //而原来那些子类的特征与方法难道就丢失了吗?
  72.           //我们知道类型决定能访问什么成员,因此想要调用子类的方法,
  73.           //就必须再将子类转换回来. 这里便是里氏转换的第二句话:
  74.           //如果父类对象指向的是一个子类对象,
  75.           //那么该父类对象可以强制转化为这个子类对象
  76.           Console.WriteLine("===============================");
  77.           Person person2 = student1;
  78.           person2.Say();
  79.           Student student2 = person2 as Student;  //能转换则转换,不能转换返回null
  80.           if(student2!=null)
  81.           {
  82.               student2.SayHello();
  83.           }
  84.           Console.ReadLine();
  85.         }
  86.     }

  87. }
复制代码
参考:http://wenku.baidu.com/view/988bf614a2161479171128b9.html



评分

参与人数 1技术分 +2 收起 理由
黑马蔡红微 + 2 赞一个!

查看全部评分

1 个回复

倒序浏览
值得学习,就是它具体应用在什么地方呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马