对象
提起面向对象,我们首先想到是类,对象,封装,继承,多态。很对,差不多就是由这些元素构成。在面向对象的世界里有“万事万物皆对象”一说,下面我们来分析对象的生命旅程。
出生
首先我们来分析下对象的生命周期,对象从开始创建,除了赋予必须的属性外,其他的都必须我们后天的附加。正如人之出生,一身赤裸,没有任何附加品,其余的一切将根据需求而来。
旅程
作为个体人,首先有类型之分,工人,农民,学者,所形成的是不同的类型在不同的领域起到相对的作用。在面向对象的世界里,也同样有类型之分,例如,整形、字符型等。常见的分类可分为值类型和引用类型,其根据是在是对象在运行时在内存中的位置,值类型位于线程的堆栈,而引用类型位于托管堆。他们之间的类型转换通过装箱和拆箱来进行。
作为人,我们都有属性,例如名字,性别,年龄,籍贯等,描述你的状态信息,同时每个人也用不同的行为操作自己的属性,实现与外界交互。对象字段,属性就是自己的标签,方法就是操作这些标签的行为。
在对象的旅程中,某种程度上就是外界通过方法和对象交互。从而达到改变对象状态信息的过程。人与人之间存在各种不同的关系。同样在对象的世界里,不同对象之间发生着不同的交互操作。对象的记录操作被记载在一本叫做“设计模式”的魔法书中。
正如人的生存环境是社会,对象的生存环境是CLR。CLR提供了对象赖以生存的托管环境,制定一系列的规则,我们称之为语法,例如类型,继承,多态,垃圾回收等,在对象世界里建立真正的法制秩序。
消亡
对象的生命由GC控制的,在人类的世界里我们把GC叫做自然规律,进入死循环的对象是违反规律的,必然无法逃避被消灭的命运。
对象的生命周期有GC控制,控制规律大概是这样的:GC管理所有的托管对象,大改内存回收执行时,GC检查托管堆中不再被使用的对象,并执行内存回收操作。不被应用程序实用的对象,指的是没有任何引用。
继承
基础为上
作为面向对象的一大特征,继承是一种从上之下,逐层具体化的过程,继承关系中,层与层的特新是向下传递的,例如鸟类具有脊椎动物的特征,鸟类具有动物的特征。
继承机制体现了面向对象技术的复用性、可扩展性和安全性。
继承按其实现方式不同可分为:
实现继承: 派生类继承基类的所有属性、方法。并且只有一个基类,在.NET中System.Object是所有类型的最终类型。
接口继承:派生类继承接口的方法和签名。不同与实现继承的是接口继承可以允许多继承。
继承本质
我们从继承的角度来分析CLR在运行时如何执行对象的创建过程,因为继承的本质正体现于对象的创建过程。
首先我们创建3个类,抽象类Animal 和基本类Bird,Chicken类。Chicken->Bird->Animal
在此我们以Chicken对象的创建为实例,首先是字段,对象已经创建 ,会首先找到其父类Bird,并为其字段分配存储空间,而Bird也会继续找到其父类Animal,为其分配存储空间,以此类推直到递归结束,也就是英雌,对象的创建过程是按照顺序完成了对整个父类及本身字段的内存创建,并且字段的存储顺序是由上倒下排列的,最高层类的字段排在最前面。其原因是如果父类和子类出现同名字段,则在子类对象创建时,编译器会自动认为这是两个不同的字段而加以区别。
面向对象的基本原则:
高内聚、低耦合
多聚合、少继承
封装的秘密
封装隐藏了类底部的具体实现细节,对外则提供统一访问接口,来操作内部数据成员。这样实现的好处是实现了UI分离。
封装的原则
尽可能的调用类的访问器,而不是成员,即使在类的内部。
内部私有部分可以任意改选,但是一定要在保证外部接口稳定的情况下。
将对字段的读写控制实现为属性,而不是方法,否则舍近求远,非明智之举。
类封装是有访问权限来保证的,对内实现为private,对外实现为public。在结合继承特性,还要对protected,internal有较深的理解。
多态的艺术
多态的类型、本质和规则
1、多态的分类
Luca Candelli在《On Understanding Types,Data Abstraction,and Pllymorphism》中将多态分为四类:强制的、重载的、参数的和包含的。
从面向对象的角度考虑,根据其实现的方式我们可以进一步分为基类继承式多态和接口实现式多态。
2、多态运行机制
动态绑定
玩转接口
所谓接口,就是契约,用于规定一种规则由大家遵循。
此文是阅读《你必须知道的.NET 2》的总结