面向对象--继承(你必须知道的.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     }
View Code

 


3.继承的问题
(1)继承可能造成子类的无限膨胀,不利于类体系的维护和安全
(2)继承的子类对象确定于编译期,无法满足需要运行期才确定的情况,而类聚合很好的解决了这一问题
(3)随着继承层次的复杂化和子类的多样化,不可避免的会出现对父类的无效继承或者有害继承。
4.总结
(1)密封类不可以被继承
(2)继承关系中,我们更多的是关注其共性而不是特性,因为共性是层次复用的基础,特性是系统扩展的基点
(3)从宏观来看,继承多关注于共通性;而多态多着眼于差异性
(4)继承的层次应该有所控制,否则类型之间的关系维护会消耗更多的精力
(5)面向对象原则:多组合,少继承;低耦合,高内聚

以上是关于面向对象--继承(你必须知道的.NET读书笔记)的主要内容,如果未能解决你的问题,请参考以下文章

《你必须知道的.NET》读书笔记二:小OO有大原则

C#刨根究底:《你必须知道的.NET》读书笔记系列

面向对象的程序设计读书笔记

面向对象的程序设计读书笔记

疯狂Java讲义-读书笔记2.1 面向对象

《你必须知道的495个C语言问题》读书笔记之第4-7章:指针