Unity3D学习资源—C#里氏转换

来源:互联网 发布:猩猩助手网络连接失败 编辑:程序博客网 时间:2024/06/05 04:44
面向对象三大特性分别是封装,继承和多态,面向对象编程的主要思想就是创建对象,调用方法达到解决问题的目的.但是好多初学者在多态方面不是太理解,主要是因为有一个概念没有搞清楚,那就是里氏转换;
  具有继承关系的父类和子类进行里氏转换时要遵循以下两个原则:
1.可以把子类直接赋值给父类,即父类的位置都可以用子类来替换;
2.在上面1的基础上,可以把父类强制转换成相对应的子类;
先看如下代码:
[C] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
classPerson
        {
                publicvoid Talk()
                {
                        Console.WriteLine("person talk");
                }
        }
 
        classStudent:Person
        {
                publicvoid Said()
                {
                        Console.WriteLine("student said");
                }
        }
Student类继承了Person类,在Main方法中的代码如下:
[C] 纯文本查看 复制代码
?
1
2
3
4
5
6
7
8
publicstatic void Main(string[] args)
                {
                        Person person = newPerson();
                        Student student = newStudent();
                        person.Talk();
                        student.Talk();
                        student.Said();
                }
Person类和Student类的对象都可以调各自类里面的公有成员,同时Student类的对象也可以调到其父类里面的公有方法,这是因为Student类继承了Person类.把上面的代码更改如下:
[C] 纯文本查看 复制代码
?
1
2
3
4
5
6
7
publicstatic void Main(string[] args)
                {
                         
                        Student student = newStudent();
                        Person per = student;
                        per.Talk();
                }
把子类Student的一个对象赋值给了其父类Person的对象,即父类的对象指向子类的对象,系统并没有报错,按常理来说学生是人是没有错的,从继承关系来说,子类把父类的成员继承了过来,父类对象在调用父类里面的公有成员时,仍可以调得到,功能没有任何改变.这个就是里氏转换第一原则:子类可以直接赋值给其父类,其作用是使数据达到了统一,就如系统里面提供的方法其参数是object类型一样,任何数据类型都可以传递.假如一个方法的参数是父类的类型,则在调用该方法时可以把子类的对象直接传递过来,功能不会受到影响;但是上面的代码有一个问题:把子类对象赋值给父类对象后,再调子类里面的公有成员时会调不到,那是因为per是父类的对象,其所在父类里面并没有子类里面的成员,所以调不到.想要调到子类里面的公有成员需把代码做如下更改:
[C] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
publicstatic void Main(string[] args)
                {
                        Student student = newStudent();
                        Person per = student;
                        //第一种转换方法,强制转换
                        Student st1 = (Student)per;
                        //第二种转换方法,使用as
                        Student st2 = per as Student;
                        st1.Said();
                        st2.Said();
                }
在第二行代码的基础上,把父类对象转换成子类类型,这样就可以调到子类里面的公有变量了.这就是里氏转换的第二个原则,有一点需要强调的是必须在第一个原则的基础上才可以完成转换.上面的代码用了两种转换方法,第一种是强制转换,如果转换不成功,系统会报错,第二种使用as进行转换,如果能够转换则进行转换,如果不能转换则返回null,什么也不做;
通过以上的代码我们可以总结出来里氏转换的作用:就是把不同子类的对象统一转换成其基类的类型,使数据类型达到统一,这样就可以写出一套用的代码,在基类对象所在的位置都可以传进来子类的对象,尽可能的来重用所写的代码.
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 速写画的慢怎么办 雾眉失败了怎么办 艾溪湖1号业主怎么办 百益健身怎么办卡 如果涂色没有画笔怎么办 打混凝土下雨了怎么办 下雨跑马拉松怎么办 儿童坐飞机忘带证件怎么办 我飞机油油超标怎么办 飞机超规格行李怎么办 打蜡后下雨了怎么办 飞机起飞耳朵不舒服怎么办 宝宝脸上口水疹怎么办 婴儿身上长癣怎么办 婴儿下巴口水藓怎么办 婴儿嘴边长癣怎么办 婴儿脸上口水癣怎么办 嘴巴旁边长癣怎么办 美团机票不出票怎么办 东方航空会员锁定怎么办 大众车烧机油怎么办 大众cc烧机油怎么办 叫外卖给差评被打怎么办 发现宿舍被盗后怎么办 知了猴变黑了怎么办 婴儿仙人掌的刺怎么办 仙人掌刺扎进皮肤里怎么办 被仙人掌的小细绒刺扎到怎么办 值机截止了怎么办 社保卡消磁了怎么办 住宾馆没身份证怎么办 社保卡电话错误怎么办 没住过酒店怎么办 上海合规网约车证件怎么办 取票没有身份证怎么办 买车票没有身份证怎么办 登机身份证丢了怎么办 飞机没带身份证怎么办 上飞机没带身份证怎么办 机场没带身份证怎么办 儿童坐飞机没有户口本怎么办