InsideVCL-第3章-面向对象程序语言和Framework
VCL Framework是使用Object Pascal和汇编语言实现的,然而大部分的实现代码都是使用Object Pascal的面向对象
技术配合Delphi研发工程师的巧思设计而成.
Framework使用面向对象程序语言的设计手法
抽象类法
VCL基本上并不喜欢使用抽象类,因为抽象类有一些问题.第一是Object Pascal允许程序员创建抽象类对象,
这会导致执行时期错误,虽然创建抽象类对象在语义上有问题,但是在语法上却是合法的.第二个是Object Pascal
可以使用接口来取代抽象类,而且使用接口设计比较符合现代面向对象的趋势,抽象类已经逐渐被接口设计取代.
第三,如果是混合抽象类以及一些实现方法,例如下面的TAbstractClass类,虽然是抽象类,但是其中的SomeConcreteMethod
却提代了实现程序代码,那么VCL Framework通常都倾向使用即将介绍的Place Holder方法.
Place Holder 方法
Place Holder方法是VCL Framework在设计核心组件类时最常使用的手法.所谓Place Holder方法
是指:父类的一些虚拟方法被实现为空白的函数而不声明为抽象方法.使用Place Holder设计的好处是避免
了抽象类的缺点,另外父类如果稍后觉得需要加入任何的实现,那么就可以在Place Holder方法中再加入
实现程序代码即可.
逐渐增加法
逐渐增加法是多态技术中经常使用的技术,也非常的简单.所谓逐渐增加法是指父类提供了基础的实现,
再交由派生类提供更多的实现.例如VCL Framework中TControl的构造函数就使用了逐渐增加法,在
使用inherited关键字调用了父代的构造函数之后,派生类才开始加入自定义的实现程序代码.
三明治手法
所谓三明治设计手法是指派生类在改写父类的方法时,会在使用关键字inherited调用父类的实现之前先加入
一些派生类的程序代码,再调用父类的实现方法,最后则再加入派生类的实现.由于派生类把使用关键字inherited
调用父类方法的指令夹在派生类两段不同的程序区块中,因此才有三明治的名称出现.
例如TControl的ReadState便使用了三明治的设计手法,在TControl对象中需要先设定csReadingState状态
,才能使用inherited调用父代的实现.
覆写父类实现法
在面向对象的多态应用中也有一种情形是特定的派生类完全不使用父类提供的实现,因此决定完全覆写父类的实现
而不是改写父类的实现,这种设计手法称为覆写父类实现法.
BootStrap设计法
所谓BootStrap设计法是指父类会定义各种服务方法,但是这些服务都需要特定的标地,但是这个特定的标地却只
由派生类提供,并不由父类提供.这种让特定的标地延迟到派生类才提供的设计便称为BootStrap设计法,这也就
是说使用这种设计的类并不能且不应该创建父类对象,而只能创建派生类对象执行.
TComponent类的设计
TComponent作为组件类的根类自然需要声明虚拟构造函数和虚拟析构函数以便让派生类可以改写.
构造函数Create,从其实现的程序代码可以看出所有从TComponent派生的对象都会加入它的父代对象管理
的所有字组件串行中,而InsertComponent方法正是TComponent类提供的基础组件管理功能之一.
由于TComponent提供了管理子组件的服务,因此在TComponent类中自然要加入父代对象的连接以及储存
所有它管理的了组件的引用值.这两个连接上层父对象及相关的所有字组件连接便是TComponent中的
FOwner以及FComponents串行.
private
FOwner:TComponent;
FName:TComponentName;
FTag:Longint;
FComponents:TList;