里氏转换
首先,里氏转换有两条特性:
1).子类可以赋值给父类。
2).如果父类中装的是子类对象,那么可以将这个父类强制转换成子类对象。
下面通过一个简单的例子来说明这两个特性。
例:向控制台随机打印连续的10行字符串(类似于“我是学生”,我是“老师”等等即可)。
先声明一系列的类,代码如下:
public class Person { public void PersonSayHi() { Console.WriteLine("我是人类"); } } public class Student : Person { public void StudnetSayHi() { Console.WriteLine("我是学生"); } } public class Teacher : Person { public void TeacherSayHi() { Console.WriteLine("我是老师"); } } public class Man : Person { public void ManSayHi() { Console.WriteLine("我是男人"); } } public class Woman : Person { public void WomanSayHi() { Console.WriteLine("我是女人"); } } }
上面代码,一共声明了5个类,1个父类,4个子类,并且每个类中都包含一个简单的方法,用于向控制台输出。
然后是Main方法中的应用了,代码如下:
static void Main(string[] args) { Person[] per = new Person[10];//声明一个Person类的数组,数值长度为10 Random r = new Random();//声明随机变量 //通过循环和随机变量对数组元素随机赋值,赋的值就是父类的子类 //这里就用到了里氏转换的第一条特性“子类可以赋值给父类”。 for (int i = 0; i < per.Length; i++) { int R= r.Next(1,6); switch (R)//随机赋值 { case 1: per[i] = new Student(); break; case 2: per[i] = new Teacher(); break; case 3: per[i] = new Man(); break; case 4: per[i] = new Woman(); break; case 5: per[i] = new Person(); break; } } //赋值完成后,per[]数组是Person类的对象,数组内的值本质上还是父类,是被子类赋值后的父类 //并不能直接就通过per[i]去调用子类里面的方法,而且per[]数组中的值都是随机的 //所以还需要先判断per[i]具体的值,然后强转为相应的子类,再调用子类中的方法 //这里就要用到里氏转换的第二条特性 for (int i = 0; i < per.Length; i++) { if (per[i] is Student) { ((Student)per[i]).StudnetSayHi(); } else if (per[i] is Teacher) { ((Teacher)per[i]).TeacherSayHi(); } else if (per[i] is Man) { ((Man)per[i]).ManSayHi(); } else if (per[i] is Woman) { ((Woman)per[i]).WomanSayHi() ; } else { per[i].PersonSayHi(); } } Console.ReadKey(); }
以上所有代码运行结果如下图:
运行结果是随机的。
拓展:
is和as的作用:
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null