面向对象--继承(你必须知道的.NET读书笔记)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象--继承(你必须知道的.NET读书笔记)相关的知识,希望对你有一定的参考价值。
1.什么是继承
继承,就是面向对象中类与类之间的一种关系
继承的实现方式:实现继承 接口继承
2.继承的本质
(1)继承是可以传递的,子类是对父类的扩展,必须继承父类的方法,同时可以添加新方法
(2)子类可以调用父类方法和字段,而父类不能调用子类方法和字段
(3)虚方法如何实现覆写操作,使得父类指针可以指向子类对象成员
(4)之类不单只继承父类的公有成员,同时继承了父类的私有成员,只是在之类中不被访问
(5)new 关键字在虚方法继承中的阻断作用
实例说明:
1 internal class Program
2 {
3 private static void Main(string[] args)
4 {
5 Bird bird=new Bird();
6 //简述创建过程:
7 /*
8 (1)Bird bird创建的是一个Bird类型的引用,而new Bird()完成的是创建Bird对象,
9 * 分配内存空间和初始化操作,然后将这个对象引用赋给bird变量,也就是建立bird变量与Bird对象的关联
10 * 继承的本质体现于对象的创建过程:我们用Chicken 对象的创建为例
11 * 1.字段,对象一经创建,会首先找到其父类Bird,并为其字段分配存储空间,而Bird继续找到父类Animal,为其
12 * 分配空间,依次类推递归结束,也就是完成system.object内存分配为止.
13 * 2.方法表的创建,方法表的创建是类第一次加载大AppDomain时完成的,在对象创建时只是将其附加成员TypeHandle指向方法列表在Loader Heap上的地址,将对象与动态方法列表关联起来,因此方法表是先于对象而存在的。
14 * 方法表的创建类似与字段的创建,类Chicken生成方法列表时,首先将bird的所有虚方法复制一份,然后和Chicken本身的方法列表做对比,如果有覆写的虚方法则以子类方法覆盖同名的父类方法,同时添加子类新方法,完成Chicken的方法列表。
15 */
16 Chicken chicken=new Chicken();
17 Bird bird2 = new Chicken();
18 var type=bird2.type;
19 Console.Read();
20 /*
21 问题:
22 * Bird bird2=new Chicken();
23 * 这种情况下,bird2.ShowType 返回什么?bird2.type是什么?
24 * 用2个原则解决这个问题:
25 * 关注对象原则:调用之类还是父类的方法,取决于创建的对象是子类还是父类对象,而不是它的引用类型。
26 * 比如:Bird bird2=new Chicken(); 我们关注的是创建对象为Chicken类型,因此子类将继承父类的字段和方法,或者覆写父类的虚方法,而不用关注bird2的引用类型是否为Bird。引用类型的区别决定了不同对象在方法表中不同的访问权限
27 * 执行就近原则:对于同名字字段或者方法,编译器是按照其顺序查找来引用,也就是首先访问离它创建近的字段或者方法,例如上面的bird2,是Bird类型,因此会首先访问Bird_type,如果type类型是public,返回"Bird"值
28 */
29 }
30 }
31
32 public abstract class Animal
33 {
34 public abstract void ShowType();
35
36 public void Eat()
37 {
38 Console.WriteLine("动物都有吃饭的行为");
39 }
40 }
41
42 public class Bird : Animal
43 {
44 public string type = "Bird";
45 public override void ShowType()
46 {
47 Console.WriteLine("Type is {0}",type);
48 }
49
50 private string color;
51
52 public string Color
53 {
54 get
55 {
56 return color;
57 }
58 set
59 {
60 color = value;
61 }
62 }
63 }
64
65 public class Chicken : Bird
66 {
67 public string type = "Chicken";
68 public override void ShowType()
69 {
70 Console.WriteLine("Type is {0}",type);
71 }
72
73 public void ShowColor()
74 {
75 Console.WriteLine("Color is {0}", Color);
76 }
77 }
3.继承的问题
(1)继承可能造成子类的无限膨胀,不利于类体系的维护和安全
(2)继承的子类对象确定于编译期,无法满足需要运行期才确定的情况,而类聚合很好的解决了这一问题
(3)随着继承层次的复杂化和子类的多样化,不可避免的会出现对父类的无效继承或者有害继承。
4.总结
(1)密封类不可以被继承
(2)继承关系中,我们更多的是关注其共性而不是特性,因为共性是层次复用的基础,特性是系统扩展的基点
(3)从宏观来看,继承多关注于共通性;而多态多着眼于差异性
(4)继承的层次应该有所控制,否则类型之间的关系维护会消耗更多的精力
(5)面向对象原则:多组合,少继承;低耦合,高内聚
以上是关于面向对象--继承(你必须知道的.NET读书笔记)的主要内容,如果未能解决你的问题,请参考以下文章