• 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

  • 相关阅读:
    EffectiveJava-4
    EffectiveJava-3
    EffectiveJava-2
    EffectiveJava-1
    jar包下载
    SpringBoot踩坑日记
    Spring全家桶——SpringBoot之AOP详解
    Spring全家桶——SpringBoot渐入佳境
    Spring全家桶一一SpringBoot与Mybatis
    SpringBoot2.x【一】从零开始环境搭建
  • 原文地址:https://www.cnblogs.com/ImOrange/p/10543440.html
Copyright © 2020-2023  润新知