黑马程序员技术交流社区
标题:
C#中关于里氏转换
[打印本页]
作者:
曹伟
时间:
2013-9-17 11:03
标题:
C#中关于里氏转换
本帖最后由 曹伟 于 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
作者:
追影
时间:
2013-9-17 17:10
值得学习,就是它具体应用在什么地方呢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2