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

本文介绍了里氏转换原则在C#编程中的应用,通过一系列的检验案例,阐述了如何在Teacher和Student类继承自Person类的情况下,有效利用里氏转换减少代码冗余并遵循开闭原则。作者强调了及时总结编程知识的重要性,以避免技能退化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  学了很长一段时间的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 { }

我是人,别怕

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

  别荒废了最能拼的年纪!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值