面向对象中几个最基本的概念:类,对象,继承,封装和多态。
对象的出生,只是完成了对必要字段的初始化,其他数据要通过后面的操作来完成,如:属性的赋值,通过方法获取必要信息等。
对向可以分为值类型和引用类型。其分类依据是在运行时在内在中的位置,值类型位于线程的堆栈,而引用类型位于托管堆。两者之间可以发生类型转换,这个过程叫做装箱与拆箱。
对对象的使用,就是外界对过调用对象中的方法与对名交互,从而达到改变对象状态信息的过程。
对象的生存环境是CLR,CLR提供了对象赖以生存的托管环境,制定一系列规则,称之为语法,在对名世界里建立起真正的秩序。面向对象的编程是以接口方式来抽象变化,从而形成体系。
访问修饰符:
public:成员访问没有限制(无向)
protected:只有当前类或当前类的派生类可以访问(纵向)
internal:访问仅限于当前程序集(横向)
private:访问仅限于当前类(点向)
protected internal:protected和internal的交集(纵向和横向)
同一方法,在不同的情况下,实现不同的操作,这就是多态的魅力。对名是多态主要包括两种情况:1,接口实现;2,抽象类实现。
GC管理所有的托管对象,当内存回收执行时,GC检查托管堆中不再被使用的对象(没有任何引用的对象),并执行内在回收操作。
关于继承:
继承是面向对象三大要素之一(另外两大是封装和多态),是面向对象中类与类之间的关系,通过继承,子类获得父类的成员,子类也可以扩展父类的成员。继承机制体现了面向对象技术中的复用性,扩展性和安全性,这面向对象开发与模块开发的基本技术。
继承按照实现方式一般可分类为:1,实现单继承;2,接口多继承
对于继承的可见性问题,在.NET中是通过访问权限(即访问修饰符)来实现控制的。
在子类中实现父类中的虚方法,称之为方法的动态绑定,这是面向对象的另一特性--多态的基本机制。
接口继承的优点:通过接口继承,实现了对象与行为的分离,
继承让我们轻松实现了代码的复用与扩展,同时,通过重载(overload,同名不同参不同实现),覆写(override,同名同参不同实现),接口实现等方式实现封装变化,隐藏私有信息等面向对象的基本规则。
在子类中实现对父类的扩展和改写,主要有两种方式:1,在子类中添加新的方法(扩展);2,对父类中方法的重新改写(改写,即覆写)
对象的创建会最先创建其最高一级的祖先类的字段,依次创建其它各级父类字段,最后创建自身字段。其次中方法表的创建,方法表的创建是类第一次被加载到AppDomain时完成的,在对象创建时只是将其附加成员的TypeHander指向方法列表在LoaderHeap上的地址,将对象与其动态方法关联起来。因此是先有方法表再有对象的。方法表的创建也是父类在先子类在后。
明确以一几点:
继承是可传递的
子类可以调用父类的方法和字段,反之不然
虚方法实现覆写操作
子类不光继承父类的公有成员,同时也继承了父类的私有成员,只是在子类中不能被访问
new关键字在虚方法继承中的阻断作用
关注对象原则:调用子类还是父类的方法,取决于创建的对象是子类对象还是父类对象,而不是它的引用类型。
执行就近原则:对于同名字段或方法,编译器按照其顺序查找来引用,即先访问离它创建近的。
实现继承和接口继承:
抽象类适合于有族层概念的类间关系,而接口最适合于为不同类提供通用功能
接口着重于CAN-DO关系类型,而抽象类型则偏重于IS-A式的关系
接口多用于定义对象的行为,抽象类多用于定义对象的属性
如果预订会出现版本问题,可以创建抽象类
值类型只能实现接口,不能继承类
聚合还是继承?
继承关系的耦合度较高。
聚合关系可以分为三种:无,共享和复合,耦合度一次提高,但还是没有继承的高,可以说耦聚是一种HAS-A关系。
依赖关系表明当类2被修改,也会影响到类1。
面向对象程序设计的基本原则是:实现多聚合,少继承,低耦合,高内聚的类间关系。
继承的高耦合度会给编程带来一定的不良反应,避免的方法有:将对象和行为分离抽象出接口,以聚合代替继承实现更柔性的子类需求等。
Adapter模式简介:
Adapter模式主要是将一个类的接口转换为另一个接口,在不改变原有体系的条件下应对新的需求变化,通过引入新的Adapter类来完成对既存体系的扩展和改造。
Adapter模式的主要实现方式:
1,类的Adapter模式:通过引入新的类型来继承原有类型,同时实现新加入的接口方法。
2,对象的Adapter模式:能过聚合方式实现对原有系统的扩展。
一些所谓有规则:
密封类不可以被继承(什么是密封类)
继承关系中关注的是共性,共性是层次复用的基础,多态着则眼于特性,而特性是系统扩展的基点
实现单继承,接口多继承
面向对象程序设计的基本原则是:实现多聚合,少继承,低耦合,高内聚的类间关系
控制继承的层数
继承是.NET运行机制的基础技术之一,一切皆为对象,一切皆于继承。
做到“理解继承,关注封装,品味多态,玩转接口”是理解面向对象的起点。
关于封装:
封装是面向对象三要素之一,它为程序设计提供了系统与系统,模块与模块,类与类相互交互的实现手段。封装隐藏类内部的具体实现,对外提供统一的访问接口来操作内部数据成员。
通常系统需求中描述的核心名词可以抽象为类,而对这些名词驱动的动作,则相应的抽象为方法。
字段:通常为private,表示类的状态信息。封装的第一个原则就是字段定义为private。
属性:通常为public,表示类的对外成员。属性通过get,set访问器来实现对属性的读写控制,实质是自动生成get_属性名和set_属性名的方法。
索引器:它是一种含参属性。
方法:方法表示类的行为,行为可分为内部行为(private)和外部行为(public),外部行为提供外部交互的接口。封装的另一个原则就是有效的保护内部数据和有效的暴露外部行为一样重要。
封装的原则:
尽可能调用类的访问器而不是成员
内部私有部分可以任意更改,但要确保外部接口部分的稳定
用属性来实现对字段的读写控制
类的封装是通常访问权限来实现控制的
封装的精华是封装变化,将类中变化频繁的部分封装为独立的部分,有利于充分的软件复用和系统柔性
关于多态:
多态是指同一操作的不同实例,产生不同运行结果的机制。多态也是面向对象三要素之一。
多态根据实现方式可分为:
基类继承式,在父类中声明一个虚方法,在不同子类中可以有不同的实现(IS-A式的)
接口实现式,以接口约定的方式规定子类中方法的实现,具有更高的灵活性(CAN-DO式的)
多态的运行机制:
.NET的动态绑定机制成就了面向对象的多态机制。
静态绑定,在编译时就确定关联,一般以方法的重载(overload)来实现。
动态绑定,又叫晚期绑定,是在运行期间通过检查虚拟方法表来确定动态关联的方法,一般以继承和虚方法(virtual)在子类中重写(override)虚方法来实现。将子类中共有的但却容易变化的特征抽取为虚方法,并在父类中定义,而在子类中重写。
关于接口:
接口是打开设计精要之门的钥匙。接口是一种约束规则,表明能够做什么(CAN-DO),不同的实现对象对同一操作可以有不同的实现方式。
基于接口的设计成就了面向对象思想中很多了不起的设计模式。
接口实质上是一种定义子抽象方法的类,该类仅提供了方法的定义,其实现由该接口的实现类来完成。实现类中对接口方法的实现实质就是一种重写(override)。因此,从某种意义上来说:接口的本质是一个不能实例化的类,接口的实现机制就是多态。
接口的原则:
接口应该是一个个具有单一功能的小接口,通过接口的组合实现类的行为扩展。
禁止为已发布的接口添加新的成员。
接口不能实例化,接口的成员隐式为public。
良好的程序是面对抽象的编程而不是面向具体的编程。
《完》
※※※※※※※※※※※※※※--我的程序人生--※※※※※※※※※※※※※※