里氏替换原则(LSP)
2015-08-23 23:12
260 查看
先看下面这段代码,ChineseStudent类继承于Student类,Student类继承于Person类。
View Code
一、a、为什么子类可以替换父类的位置?
1)因为父类拥有的功能,子类都拥有,子类只会多功能,不会少功能。
2)要一个父类对象,但是我们却给了一个子类对象,这是说得通的。为什么呢?因为子类是1个父类。
3)是满足自动类型转换的:父类和子类是相互兼容的,而且父类的范围是比子类的范围要大
b、里氏替换原则的具体表现形式:当1个父类变量指向1个子类对象的时候,这个时候就用我们的里氏替换原则了。
c、里氏替换原则的好处在哪?
a、最大的好处是为了多态。
b、1个父类变量不仅仅可以指向父类对象,还可以指向它的子类对象。
d、在替换的时候,只能是子类替换父类。没有继承关系的是绝对不能替换的。父类也不能去替换子类的位置。
e、当一个父类变量指向一个子类对象的时候,通过这个父类变量只能调用到这个子类对象中的父类成员。子类独有的成员通过这个父类变量是无法调用的。哪怕子类和父类中存在同名成员,通过这个父类变量调用这个同名成员仍然调用的是父类
二、类型转换
a、没有办法直接的将1个父类类型的变量的值赋值给一个子类类型的变量。
b、如果一定要赋值的话,那么我们使用强制转换的语法就可以了。
c、类型转换的意义:强制的把父类变量中的值(对象的地址)赋值给子类变量。
d、转换成功的条件:
如果子类变量能够指向父类变量指向的对象,那么就可以转换成功。
变量能够指向哪些对象?变量可以指向本类的对象和本类的子类对象。
e、类型转换只适合于有继承关系的,否则就会报语法错误。
三、类型判断
1、is关键字可以判断某个类型的类型。
a、某个变量一定是这个变量的类型
Person p; p变量一定是1个Person类型
b、如果变量指向一个子类对象,那么这个变量也是这个子类类型
Person p=new Student();
p 一定是1个Person类型。p也是1个student类型的。
c、如果一个父类变量指向一个子类对象,那么这个父类变量的类型即是父类的类型,也是指向的子类对象的类型,也是指向的子类对象的父类的类型。
Person p = new ChineseStudent();
(p是1个Person类型,P是ChineseStudent类型,P是Student类型)
d、子类一定是1个父类类型。当父类变量指向1个子类对象的时候,这个父类变量也是这个子类类型的。
eg:p is Student
P变量的类型本身就是Student ;
P变量指向1个Student对象;
P变量指向1个student子类对象;
通过is关键字来判断1个引用类型的变量是否指向1个指定的对象。
is关键字只适合用于判断拥有继承关系的类型。
在做转换的时候,如果要保证不会发生异常,我们在转换之前最好是做1个类型判断。
as 转换 ,与强制转换的效果是一样的。
as转换在转换失败的时候,不报异常,返回null。强制转换如果转换失败,会报异常。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Person { } class Student : Person { } class ChineseStudent : Student { } class Program { static void Main(string[] args) { Person person = new Student(); Person person2 = new ChineseStudent(); } } }
View Code
一、a、为什么子类可以替换父类的位置?
1)因为父类拥有的功能,子类都拥有,子类只会多功能,不会少功能。
2)要一个父类对象,但是我们却给了一个子类对象,这是说得通的。为什么呢?因为子类是1个父类。
3)是满足自动类型转换的:父类和子类是相互兼容的,而且父类的范围是比子类的范围要大
b、里氏替换原则的具体表现形式:当1个父类变量指向1个子类对象的时候,这个时候就用我们的里氏替换原则了。
c、里氏替换原则的好处在哪?
a、最大的好处是为了多态。
b、1个父类变量不仅仅可以指向父类对象,还可以指向它的子类对象。
d、在替换的时候,只能是子类替换父类。没有继承关系的是绝对不能替换的。父类也不能去替换子类的位置。
e、当一个父类变量指向一个子类对象的时候,通过这个父类变量只能调用到这个子类对象中的父类成员。子类独有的成员通过这个父类变量是无法调用的。哪怕子类和父类中存在同名成员,通过这个父类变量调用这个同名成员仍然调用的是父类
二、类型转换
a、没有办法直接的将1个父类类型的变量的值赋值给一个子类类型的变量。
b、如果一定要赋值的话,那么我们使用强制转换的语法就可以了。
c、类型转换的意义:强制的把父类变量中的值(对象的地址)赋值给子类变量。
d、转换成功的条件:
如果子类变量能够指向父类变量指向的对象,那么就可以转换成功。
变量能够指向哪些对象?变量可以指向本类的对象和本类的子类对象。
e、类型转换只适合于有继承关系的,否则就会报语法错误。
三、类型判断
1、is关键字可以判断某个类型的类型。
a、某个变量一定是这个变量的类型
Person p; p变量一定是1个Person类型
b、如果变量指向一个子类对象,那么这个变量也是这个子类类型
Person p=new Student();
p 一定是1个Person类型。p也是1个student类型的。
c、如果一个父类变量指向一个子类对象,那么这个父类变量的类型即是父类的类型,也是指向的子类对象的类型,也是指向的子类对象的父类的类型。
Person p = new ChineseStudent();
(p是1个Person类型,P是ChineseStudent类型,P是Student类型)
d、子类一定是1个父类类型。当父类变量指向1个子类对象的时候,这个父类变量也是这个子类类型的。
eg:p is Student
P变量的类型本身就是Student ;
P变量指向1个Student对象;
P变量指向1个student子类对象;
通过is关键字来判断1个引用类型的变量是否指向1个指定的对象。
is关键字只适合用于判断拥有继承关系的类型。
在做转换的时候,如果要保证不会发生异常,我们在转换之前最好是做1个类型判断。
as 转换 ,与强制转换的效果是一样的。
as转换在转换失败的时候,不报异常,返回null。强制转换如果转换失败,会报异常。
相关文章推荐
- 第33讲:List的一阶函数操作代码实战详解
- UI需要记忆的东西
- Android数据库ORMlite框架翻译系列(第二章:part 2)
- 设计模式(一)之理解篇
- Queue同步队列类在python中的应用
- Gradle digest
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) Order Book 模拟
- POJ 1995 Raising Modulo Numbers(快速幂取余)
- Activity
- Linux下简单Shell实现(三)获取任务列表
- HDU 2768Cat vs. Dog二分图 最大独立集(最大匹配)
- Bit-map法处理大数据问题
- HDUOJ_5137(dijkstra)(How Many Maos Does the Guanxi Worth)
- Android数据库ORMlite框架翻译系列(第二章:part 1)
- leveldb学习:skiplist
- RPC和NFS还有如此的渊源TODO
- Java(十二)--List的添加,修改,删除
- Linux多线程如何避免死锁
- SQL操作全集
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) Array 模拟