里氏转换,
1子类可以赋值给父类。
2如果父类中装的是子类对象,可以将这个父类强转换成子类。
看看这个例子就能懂。
namespace 里氏转换
{
class Program
{
static void Main(string[] args)
{
//Student stu = new Student();
//Person P1 = stu;
string s = string.Join("|", new string[] { "1", "2", "3", "4", "5" });
//里氏转换,
//1子类可以赋值给父类
//实例化一个子类对象
//Teachaer teach = new Teachaer();
//声明一个父类对象
//Person P1;
//将子类的值赋值给父类
// P1 = teach;
//可以简写为
// Person P2 = new Student();
//P2.SayHello();
//如果父类中装的是子类对象,可以将这个父类强转换成子类
//Student stu2 = (Student)P2;
//stu2.studentSayHello();
//一般在转换前做一个判断,判断的关键字为is和as。is的返回值为TURE和FALSE.as关键字,如果可以转换,则返回转换的对象,如果不能转换,则返回null。
// Teachaer t2 = P1 as Teachaer;
//t2.teacherSayHello();
//if (P1 is Teachaer)
//{
// Teachaer t1 = (Teachaer)P1;
// t1.teacherSayHello();
//}
//else
//{
// Console.WriteLine("转换失败");
//}
//Console.WriteLine(s);
//创建十个对象,通过循环去调用他们打招呼的方式,
//让他们都继承Person类,创建一个Person类的数组,
Person[] P = new Person[10];//打招呼要十次,所以创建十个元素的Person数组。
Random r = new Random();
//通过遍历数组给P赋值
//先遍历这个数组
for (int i = 0; i < P.Length; i++)
{
int rnubers = r.Next(1, 7);
//现在这个P数组什么都没有,通过seich循环来给它赋值
switch (rnubers)
{
case 1:
P[i] = new Student();
break;
case 2:
P[i] = new Teachaer();
break;
case 3:
P[i] = new ShuaiGuo();
break;
case 4:
P[i] = new Meinv();
break;
case 5:
P[i] = new YeShou();
break;
case 6:P[i] = new Person();
break;//这样就给P这个数组通过随机数的方法完全赋值了。
}
//遍历这个数组,来输出sayhello的方法。
}
for (int i = 0; i < P.Length; i++)
{
//遍历了这个数组 在这个地方如果输出p[i].sayhello的方法的话,会全部输出我是人类,
//是因为这是一个person类的数组,要通过里氏转化,is或者as转换成子类的对象才可以调用子类中的方法
if (P[i] is Student)
{
//进行转换
((Student)P[i]).studentSayHello();
}
else if(P[i] is YeShou)
{
((YeShou)P[i]).YeShouSayHello();
}
else if(P[i] is Meinv)
{
((Meinv)P[i]).meiNvSayHello();
}
else if(P[i]is Teachaer)
{
((Teachaer)P[i]).teacherSayHello();
}
else if(P[i] is ShuaiGuo)
{
((ShuaiGuo)P[i]).shuaiGuoSayHello();
}
else
{
P[i].SayHello();
}
}
Console.ReadKey();
}
}
class Person
{
public void SayHello()
{
Console.WriteLine("我是人类");
}
}
class Student : Person
{
public void studentSayHello()
{
Console.WriteLine("我是学生");
}
}
class Teachaer : Person
{
public void teacherSayHello()
{
Console.WriteLine("我是老师");
}
}
class Meinv : Person
{
public void meiNvSayHello()
{
Console.WriteLine("我是美女");
}
}
class ShuaiGuo : Person
{
public void shuaiGuoSayHello()
{
Console.WriteLine("我是帅锅");
}
}
class YeShou : Person
{
public void YeShouSayHello()
{
Console.WriteLine("我是野兽");
}
}
}
网友评论