里氏替换原则(LSP)

先看下面这段代码,ChineseStudent类继承于Student类,Student类继承于Person类。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Test1
 7 {
 8     class Person
 9     { }
10 
11     class Student : Person
12     { }
13 
14     class ChineseStudent : Student
15     { }
16 
17     class Program
18     {
19         static void Main(string[] args)
20         {
21             Person person = new Student();
22             Person person2 = new ChineseStudent();
23         }
24     }
25 }
View Code
为什么子类可以替换父类的位置?
     1)因为父类拥有的功能,子类都拥有,子类只会多功能,不会少功能。
     2)要一个父类对象,但是我们却给了一个子类对象,这是说得通的。为什么呢?因为子类是1个父类。
     3)是满足自动类型转换的:父类和子类是相互兼容的,而且父类的范围是比子类的范围要大
 
里氏替换原则的具体表现形式
当1个父类变量指向1个子类对象的时候,这个时候就用我们的里氏替换原则了。
 
里氏替换原则的好处在哪?
a、最大的好处是为了多态。
b、1个父类变量不仅仅可以指向父类对象,还可以指向它的子类对象。
 
     在替换的时候,只能是子类替换父类。没有继承关系的是绝对不能替换的。父类也不能去替换子类的位置。当一个父类变量指向一个子类对象的时候,通过这个父类变量只能调用到这个子类对象中的父类成员。子类独有的成员通过这个父类变量是无法调用的。哪怕子类和父类中存在同名成员,通过这个父类变量调用这个同名成员仍然调用的是父类
     
类型转换
     a、没有办法直接的将1个父类类型的变量的值赋值给一个子类类型的变量。
     b、如果一定要赋值的话,那么我们使用强制转换的语法就可以了。
     c、类型转换的意义:强制的把父类变量中的值(对象的地址)赋值给子类变量。
     d、转换成功的条件:
         如果子类变量能够指向父类变量指向的对象,那么就可以转换成功。
         变量能够指向哪些对象?变量可以指向本类的对象和本类的子类对象。
    e、类型转换只适合于有继承关系的,否则就会报语法错误。
 
类型判断
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。强制转换如果转换失败,会报异常。
posted @ 2015-08-23 23:12  Chen_Weifeng  阅读(516)  评论(0编辑  收藏  举报