分享
 
 
 

Delphi.NET 内部实现分析(3.4)

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Delphi.NET 内部实现分析(3.4)

由此我们可以看出,Delphi.NET中使用了从内嵌子类到class helper种种方法,

才总算解决了从传统继承模型和内存模型迁移到CLR以及FCL类树的过程,迁移过程不可谓不艰辛。

虽然这种解决方法不能算是完美,但相信Borland也是在综合评估了诸多其它手段之后,

才做出这样的选择,付出了一些代价、如class helper,也取得了不少的成果、源代码级兼容较强。

这种映射模型到底行不行,我想只能有待时间来做评论。

最后我们来看看Delphi的is和as关键字是如何在Delphi.NET中实现的

//-----------------------------------------Borland.Delphi.System.pas--

function _IsClass(Obj:TObject; Cls:TClass): Boolean;

var

t1, t2: System.Type;

begin

if not Assigned(Obj) then

Result := false

else

begin

t1 := Obj.GetType;

t2 := System.Type.GetTypeFromHandle(_TClass(Cls).FInstanceType);

if t1 = t2 then

Result := true

else

Result := t1.IsSubclassOf(t2);

end;

end;

//-----------------------------------------Borland.Delphi.System.pas--

_IsClass函数实现很简单,检测对象有效性后直接通过判断两个类型的继承关系检测。

//-----------------------------------------System.pas--

function _IsClass(Child: TObject; Parent: TClass): Boolean;

begin

Result := (Child <> nil) and Child.InheritsFrom(Parent);

end;

//-----------------------------------------System.pas--

相比之下Delphi的is实现更简单,直接用TObject.InheritsFrom实现。

Delphi.NET之所以不象Delphi那样直接使用TObject.InheritsFrom实现is关键字,

是因为相对于Type.IsSubclassOf方法来说,TObjectHelper.InheritsFrom方法

使用的Type.IsInstanceOfType方法代价较大。

Type.IsSubclassOf方法只是从传入类型开始,一级一级查看其父类是否自己。

//-----------------------------------------Type.cs--

public abstract class Type : MemberInfo, IReflect

{

public virtual bool IsSubclassOf(Type c)

{

Type p = this;

if (p == c)

return false;

while (p != null) {

if (p == c)

return true;

p = p.BaseType;

}

return false;

}

}

//-----------------------------------------Type.cs--

而Type.IsInstanceOfType则要考虑Remoting、COM、接口以及运行时类型等等

诸多复杂因素,因而不适合用在is/as这样频繁使用的关键字实现上。

//-----------------------------------------Borland.Delphi.System.pas--

function _AsClass(Obj:TObject; Cls:TClass): TObject;

begin

Result := Obj;

if not _IsClass(Obj, Cls) then

raise System.FormatException.Create('Invalid Cast');

end;

//-----------------------------------------Borland.Delphi.System.pas--

as操作符的实现,只是简单的赋值加检测而已,因为CLR是单根结构,所以转换总是成功的,

只需在转换后用is操作符检测,抛出异常情况就行。

//-----------------------------------------System.pas--

function _AsClass(Child: TObject; Parent: TClass): TObject;

{$IFDEF PUREPASCAL}

begin

Result := Child;

if not (Child is Parent) then

Error(reInvalidCast); // loses return address

end;

//-----------------------------------------System.pas--

可以看到Delphi中的实现也是非常类似的。

最后一个相关函数是_ClassCreate,用于实现类型的创建与构造。

//-----------------------------------------Borland.Delphi.System.pas--

function _ClassCreate(Cls: TClass; Params: Array of TObject): TObject;

begin

Result := System.Activator.CreateInstance(Cls.SystemType, Params);

end;

//-----------------------------------------Borland.Delphi.System.pas--

与Delphi的System.pas中冗长的_ClassCreate函数实现相比,Delphi.NET无需关心

类的内存获取、构造异常的截获以及Self指针的修正等等,只是简洁的通过System.Activator类

完成所需功能,这就是底层有一个强大完善类库支持的优势所在。

至此,Borland.Delphi.System单元中关于元类、类与对象的相关定义及实现就基本上分析完了,

虽然只有寥寥百来行代码,但它为Delphi在CLR上的映射打下了坚实的基础。

下一节我们将进一步看看Delphi中消息与方法的映射关系是如何在Delphi.NET中模拟的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有