C#-里氏转换

里氏转换

首先,里氏转换有两条特性:

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

posted @ 2019-03-16 18:13  杯子旁边有手机  阅读(288)  评论(0编辑  收藏  举报