C# 里氏转换
1.里氏转换
主要记住下面两句精华,写代码的过程中经常用到里氏转换
(1)子类可以赋值给父类;如果有一个地方需要一个父类作为参数,我们可以给一个子类代替.
举个小例子说明一下:
//下面这个Join函数,第一个值是string类型,第二个是“params object[] values”
string s = "abcdefg";
char[] chs = s.ToCharArray();//char[] 数组属于object[] values的子类,因为object是所有类的基类
string str = string.Join("|", chs);//第一个值是string类型,第二个是“params object[] values”
Console.WriteLine(str);
Console.ReadKey();
(2)如果父类中装的是子类对象,那么可以将这个父类强转换为子类对象
例子如下
主程序:
Student student = new Student();//student是子类
Person person = student;//子类可以赋值给父类
上面这两句代码可以简写成:
Person person = new Student();//父类中装的是子类对象
//new Student() 创建子类对象
接着:
Person person = new Student();//父类中装的是子类对象
Student s = (Student)person;//父类强转换为子类对象
s.StudentSayHello();//输出我是学生
Console.ReadKey();
类代码:
public class Person
{
public void PersonSayHello()
{
Console.WriteLine("我是父类");
}
}
public class Student : Person
{
public void StudentSayHello()
{ Console.WriteLine("我是学生"); }
}
public class Teacher : Person
{
public void TeacherSayHello()
{
Console.WriteLine("我是老师");
}
}
(3)is表示类型转换,如果能够转换成功,则返回一个true,否则返回一个true
Person p = new Student();
if (p is Teacher)
{
Teacher teacher = (Teacher)p;
teacher.TeacherSayHello();
Console.ReadKey();
}
else
{
Console.WriteLine("转换失败");
Console.ReadKey();//这个例子输出的是false
}
(4)as也表示类型转换,如果能够转换则返回对应的对象,否则返回一个null
Person p = new Student();
Teacher teacher = p as Teacher;
Console.ReadKey();//此时的teacher为null
Person p = new Student();
Student student = p as Student;
student.StudentSayHello();
Console.ReadKey();//可以调用方法
(5)里氏转换小练习,直接附上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _02_里氏转换练习
{
internal class Program
{
static void Main(string[] args)
{ //里氏转换:子类可以赋值给父类
Person[] p = new Person[10];
Random r = new Random();
for (int i = 0; i < p.Length; i++)
{
int num= r.Next(1, 7);
//里氏转换:子类可以赋值给父类
switch (num) {
case 1:
p[i] = new Person();
break;
case 2:
p[i] = new Student();
break;
case 3:
p[i] = new Teacher();
break;
case 4:
p[i] = new Meinv();
break;
case 5:
p[i] = new Shuaige();
break;
case 6:
p[i] = new Monster();
break;
}
}
// 如果父类中装的是子类对象,那么可以将这个父类强转换为子类对象
for (int i = 0; i < p.Length; i++)
{
if (p[i] is Student)
{
((Student)p[i]).StudentSayHi();
}
else if (p[i] is Meinv)
{
((Meinv)p[i]).MeinvSayHi();
}
else if (p[i] is Shuaige)
{
((Shuaige)p[i]).ShuaigeSayHi();
}
else if (p[i] is Monster)
{
((Monster)p[i]).MonsterSayHi();
}
else if (p[i] is Teacher)
{
((Teacher)p[i]).TeacherSayHi();
}
else { p[i].PersonSayHi(); }
}
Console.ReadKey();
}
}
public class Person
{
public void PersonSayHi()
{
Console.WriteLine("我是人类");
}
}
public class Student : Person
{
public void StudentSayHi()
{
Console.WriteLine("我是学生");
}
}
public class Teacher : Person
{
public void TeacherSayHi()
{
Console.WriteLine("我是老师");
}
}
public class Meinv : Person
{
public void MeinvSayHi()
{
Console.WriteLine("我是美女");
}
}
public class Shuaige : Person
{
public void ShuaigeSayHi()
{
Console.WriteLine("我是帅哥");
}
}
public class Monster:Person
{
public void MonsterSayHi()
{
Console.WriteLine("我是野兽");
}
}
}