里氏替换原则
1)说明: |
C#中在使用继承的过程中可能会出现子类对象转换为父类类型使用的情况,这个过程就叫做里氏替换原则。多用于将子类对象作为实参传入形参为父类类型的方法中,进而实现“多态”。 |
2)扩展: |
在C++中亦叫做“赋值兼容性原则”,同样是实现多态的主要途径,其原理是通过虚函数表与VPTR指针实现“迟绑定”,进而判断调用具体的函数。 |
3)应用之一:类型转换 |
a. 隐式转换:子类对象转换为父类类型可以直接转; b. 显式转换:父类对象转换为子类类型必须使用强转(强制转换),前提是这个父类变量确实指向的是一个子类对象。其后果由程序员负责。 |
4)强制转换的两种方法: |
|
5)使用as进行强转的优点: |
如果使用前者,转换不成功会报异常,而使用“as”的话,如果转换不成功不会报异常而是会返回null。 |
6)应用之二:作为参数 |
形参为父类类型,实参为子类对象,方法调用时根据实参的实际类型调用相应的方法,常用于实现多态。 |
7)代码: |
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace _01里氏替换原则
7 {
8 public class Program
9 {
10 static void Main(string[] args)
11 {
12 //============================类型转换1=========================
13 //方法1:判断+转换【两次判断】
14 Person p1 = new Chinese();
15 if (p1 is Chinese)//返回true
16 {
17 //类型转换
18 Chinese cn1 = (Chinese)p1;
19 }
20 else
21 {
22 Console.WriteLine("类型不匹配");
23 }
24 Console.ReadKey();
25
26 //============================类型转换2=========================
27 //方法2:as转换 【一次判断】
28 Person p2 = new Chinese();
29 Chinese cn2 = p2 as Chinese;
30 Console.WriteLine(cn2.Age);
31 Console.ReadKey();
32
33 }
34 }
35 public class Person
36 {
37 public string Name
38 {
39 set;
40 get;
41 }
42 public int Age
43 {
44 set;
45 get;
46 }
47 }
48 public class Chinese:Person
49 {
50 public string Color { set; get; }
51 }
52 }
|