其他分享
首页 > 其他分享> > 里氏转换

里氏转换

作者:互联网

里氏转换

1)、子类可以赋值给父类
2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。

里氏转换就是将父类转换为合适的子类,或者是用子类代替一下父类,也就是将子类对象给父类

作用

子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。一开始只有儿子能用爹的方法,里氏转换后,爹也能用儿子的方法了,差不多就是继承的话,子类继承父类,子类能调父类,但是父类不能。但是你把一个子类对象给父类的话,父类就可以转为子类,然后就能使用子类的方法,如果父类没有包含子类,也就是没有把子类给父类,父类就不能强转为子类,就是一个子类对象可以在继承关系里来回转,只不过成派生类时转回基类需要显式。

比如:现在有三个类
基类:Person
派生类:Teacher、Student

将子类对象给父类,

Student student = new Student();
Person person = student;

//或者直接这样写
Person person = new Student();

里氏转换,因为子类继承了父类,并且子类新建对象时在内存中已经开辟了父类的内存空间,
因此可以将新建(注意,没有new父类,因此新建的父类对象没有开辟另外的内存空间)一个父类对象,然后将子类的值赋值给父类.



将装有子类对象的父类转为子类

            Person person = new Student();

            Student s = (Student)person;//将子类对象赋值给父类,再将父类中的子类对象强制转换成子类


将装有子类对象的父类转为其他子类

            Person person = new Student();

            Teacher t = (Teacher)person;//这样会 报异常,因为当前父类 装的 是 student这个子类,而不是Teacher这个子类

这样会报异常,因为当前父类里面并没有装Teacher类,而是装的Student类



判断是否能转

is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null

is

            Person person = new Student();


            if (person is Teacher)
            {
                Teacher t = (Teacher)person;
                t.Teach();
            }
            else
            {

                Console.WriteLine("转换失败 ");
            }

as

Person person = new Student();


            Teacher t = person as Teacher;//转换失败,结果为空

标签:转换,对象,里氏,person,Student,子类,父类,Teacher
来源: https://www.cnblogs.com/fhzmasl/p/15371668.html