菜鸟升级记——里式转换原则

  学了很长一段时间的C#,当时对于一些理论东西还是比较明白的,但是随着时间的推移,有很多知识点变得模糊,所以就体现出及时总结的好处。还是那句“欠下的总归要还的”,及时总结真的很重要!那里氏转换是如何实现的,下面就跟着小编来学习一下吧!

前提:Teacher和Student继承Person,且Teacher、Student和Person都有一个相同名称的方法。

    public class Person
    {
        public void Show()
        {
            Console.WriteLine("我是人,别怕");
        }
    }
    public class Teacher : Person
    {
        public void Show()
        {
            Console.WriteLine("我是老师");
        }
    }
    public class Student : Person
    {
        public void Show()
        {
            Console.WriteLine("我是学生");
        }
    }

检验1:

    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Teacher();//实例化子类,将子类变成父类
            p.Show();//调用父类的方法

            Console.ReadKey();//如果子类和父类里有相同的名称的方法,里式转换就是为了调用父类的方法
        }
    }
我是人,别怕

检验2:

    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person()
            
            Student stu = (Student) p;//父类被强制转换成子类,报异常,也就是说父亲当不了儿子
            stu.Show();

            Console.ReadKey();
        }
    }
未经处理的异常:  System.InvalidCastException: 无法将类型为“_05里式替换原则.Person”的对象强制转换为类型“_05里式替换原 则.Student”。

检验3:

    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Student();//实例化子类,将子类变成父类

            Student stu = (Student) p;//成为父类的子类,又被强制转换成子类
            stu.Show();//调用子类的方法

            Console.ReadKey();
        }
    }
我是学生

检验4:

    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Teacher();//实例化的是Teacher

            Student stu = (Student) p;//转换成Student,报异常
            stu.Show();

            Console.ReadKey();//如果new的是子类,转换的时候,转的是另一个子类报异常
        }
    }
未经处理的异常:  System.InvalidCastException: 无法将类型为“_05里式替换原则.Teacher”的对象强制转换为类型“_05里式替换原则.Student”。

检验5:

    class Program
    {
        static void Main(string[] args)
        {
            Student stu=new Student();//实例化子类

            Person p = stu;//子类隐式转换为父类
            p.Show();//调用父类的方法

            Console.ReadKey();
        }
    }
我是人,别怕

检验6:

   class Program
    {
        static void Main(string[] args)
        {
            Student stu=new Student();
            stu.Show();//子类中没有与父类相同的方法,实例化子类后调用的是父类的方法

            Console.ReadKey();
        }
    }

    public class Person
    {
        public void Show()
        {
            Console.WriteLine("我是人,别怕");
        }
    }
    public class Student : Person { }

我是人,别怕

  重新学习了一下,心里又踏实了一点…我认为里氏转换:一是为了避免代码冗余,把子类共有的特性都写在父类当中,通过里氏转换直接调用父类;二是遵循开闭原则,当增加子类新的行为的时候,通过里式转换只需在实例化的地方进行修改,其他地方不必修改,但如果不用里氏转换,还得给子类增加的新行为。

  别荒废了最能拼的年纪!

你可能感兴趣的:(#,C#)