您的位置:首页 > 其它

里氏替换原则(LSP)

2015-08-23 23:12 260 查看
先看下面这段代码,ChineseStudent类继承于Student类,Student类继承于Person类。

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。强制转换如果转换失败,会报异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: