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

原创 2004年03月03日 11:38:00

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

由此我们可以看出,Delphi.NET中使用了从内嵌子类到class helper种种方法,
才总算解决了从传统继承模型和内存模型迁移到CLR以及FCL类树的过程,迁移过程不可谓不艰辛。
虽然这种解决方法不能算是完美,但相信Borland也是在综合评估了诸多其它手段之后,
才做出这样的选择,付出了一些代价、如class helper,也取得了不少的成果、源代码级兼容较强。
这种映射模型到底行不行,我想只能有待时间来做评论。
  
最后我们来看看Delphiisas关键字是如何在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--
  
相比之下Delphiis实现更简单,直接用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则要考虑RemotingCOM、接口以及运行时类型等等
诸多复杂因素,因而不适合用在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--
  
DelphiSystem.pas中冗长的_ClassCreate函数实现相比,Delphi.NET无需关心
类的内存获取、构造异常的截获以及Self指针的修正等等,只是简洁的通过System.Activator
完成所需功能,这就是底层有一个强大完善类库支持的优势所在。
  
至此,Borland.Delphi.System单元中关于元类、类与对象的相关定义及实现就基本上分析完了,
虽然只有寥寥百来行代码,但它为DelphiCLR上的映射打下了坚实的基础。
  
下一节我们将进一步看看Delphi中消息与方法的映射关系是如何在Delphi.NET中模拟的。

陶哲轩实分析 3.4

陶哲轩实分析 3.43.4.1设 VV 在 f−1f^{-1} 的象为 MM。 VV 在 ff 的逆象为 NN。证明M=NM=N 相当于证明 M⊆N,N⊆MM \subseteq N, N \sub...
  • liyuanbhu
  • liyuanbhu
  • 2017年11月04日 23:02
  • 368

【深度探索STL】详解 vector 内部机制

前面初步介绍了序列式容器 vector :初识序列式容器vector,这里试图通过简单剖析源码来了解 vector 的内部机制,参考资料:《STL 源码剖析》(侯捷)...
  • yeswenqian
  • yeswenqian
  • 2014年02月23日 23:59
  • 2132

ConcurrentHashMap 内部实现分析

ConcurrentHashMap ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。Concurren...
  • bigtree_3721
  • bigtree_3721
  • 2016年05月02日 01:03
  • 286

ServiceLoader内部实现分析

followtry 2017-04-23 01:03 背景 对于技术,要知其然更要知其所以然,在上一篇文章简单介绍了ServiceLoader的基本使用,完成了知其然的阶段,本篇要完成...
  • u011277123
  • u011277123
  • 2017年05月05日 09:00
  • 152

mongodb3.4的安装和配置

下载去官网下载:http://www.mongodb.org/downloads由于是在window下,所以我下载的是msi格式,傻瓜式安装。安装这个和普通安装软件exe一样,一直点下一步,中途改改安...
  • u013066244
  • u013066244
  • 2016年12月23日 14:11
  • 10878

3.4、#pragma预处理分析

1、#pragma是编译器指示字,用于指示编译器完成一些特定的动作      #pragma所定义的很多指示字是编译器和操作系统特有的      #pragma在不同的编译器间是不可移植的   ...
  • lbd321
  • lbd321
  • 2017年03月09日 22:34
  • 55

MongoDB3.4版本配置详解

配置说明     在Mongod安装包中,包含2个进程启动文件:mongod和mongos;其中mongd是核心基础进程,用来接收读写请求、负责存储实际数据,mongod实例是构成集群的基本单位,比...
  • sun491922556
  • sun491922556
  • 2017年07月11日 15:45
  • 4074

各种内部排序算法的比较和应用

一、内部排序算法的比较 1.内部排序主要有插入排序,交换排序,选择排序,归并排序和基数排序。 其中插入排序的基本思想在于每次将一个待排序的记录按其关键字的大小插入到前面已经排好的序列中。实现算法主要有...
  • aaronkwo
  • aaronkwo
  • 2017年05月06日 20:23
  • 828

STL源码剖析——deque的实现原理和使用方法详解

Deque 简介     deque是“double—ended queue”的缩写,和vector一样都是STL的容器,deque 是双端数组,而 vector 是单端的。     deque 在接...
  • baidu_28312631
  • baidu_28312631
  • 2015年08月26日 10:48
  • 3816

cocos2d-x 3.4之排行榜的实现

cocos2d-x 3.4之排行榜的实现
  • lx417147512
  • lx417147512
  • 2015年05月03日 20:40
  • 1838
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi.NET 内部实现分析(3.4)
举报原因:
原因补充:

(最多只允许输入30个字)