里氏转换

2016-12-23  本文已影响93人  a04a42f99657

里氏转换,

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("我是野兽");
    }
}

}

上一篇下一篇

猜你喜欢

热点阅读