请问如何在Delphi中利用Object Pascal实现类似C++中的模板类的功能。(100分)

  • 主题发起人 主题发起人 starfish
  • 开始时间 开始时间
> (TEdit *)Sender->... 你当然也可以用 dynamic_cast 关键字,但在编译器内部这和前面一种方式没有两样。
此说也不妥,因为不一样。

>of Object 语法,说明它们携带有 RTTI 信息
也不妥,of Object只是相当于c++里面 ClassName::func(...) 的类成员函数指针,
表示函数隐藏了第一个参数,就是对象的指针,和rtti无关。
因为原来c++中这种必须指定类的名字,如果使用的时候与定义的类不同,
需要加强制类型指定,比较麻烦,所以加了 __closure 关键字来简化

至于说bcb实现vcl搞的复杂了,不过我相信很多人还是不觉得复杂的,否则bcb也卖不出去了
 
呵呵,你们真是集中力量啊,不过也没办法,谁让Phoenix2000说话没说到点子上呢?
他试图证明一个正确的命题,但是论据却有毛病,可不是授人以柄么? :-)

RTTI是C++标准中的内容,不论实现方式如何,实现了就行,因此这不是OP对C++的优势

单根结构和多重继承本质上是矛盾的,生拉硬扯肯定不会有好处,
因此C++不会使用单基类的,否则搞不好真成了“鸡肋”了 :-)

不过再次强调一点,BCB可绝对没有“实现VCL”,只是使用了VCL。

>>不过从上面说的,我没有看出OP优越特性的真凭实据来。
当然看不出来,因为么有啊! :-)
OP对于C++至根本优势在于对象实现机制,集中体现之一就是虚拟构造函数,
只要理解了这个问题,就知道为什么C++“不能写”VCL了。
置于如何理解,读一读我推荐的文章,看一看VCL源代码,自己作几个例子... :-)
 
讨论这类问题实在让我头痛,因为我一向是有什么用什么,从来不敢奢求要什么
样子的东西 :)))
 
呵呵,非也非也,有什么用什么,我想大家都一样吧,老板一声令下,还能咋样?
不过要做到会用,用的好,这个“什么”,我们总得知道他到底是什么吧? :-)

这个问题虽然是问模板,可我早猜到会“落实”到OP vs C++上,
因此一直"隐忍不发",等到大家走上“正题”,才来掺和两下...

(我只是和你讨论一下,何必那么认真呢?需要么?...)
 
各位大虾,我只想问是否有办法实现类似模板的功能,但是你们好像走题了。
模板功能还是很有用的,比如你要写一个操纵线性表的函数,但是线性表的元素的
类型要在调用该函数时才能确定,这时候C++中的模板功能就非常方便。
既然Delphi没有模板,就只有另想办法了。我想到的方法是建立一个类,该类可以存储和
操作任意类型的数据变量,在该类的内部利用指针和GetMem,FreeMem等函数直接对内存块
进行操作,当然要知道变量的类型所占的字节数(用SizeOf),该类的所用方法都是
无类型的参数,体方法和Delphi的帮助里面的一个关于函数的无类型参数的sample类似。
用该类我基本上已经能够达到类似模板的功能(当然只是功能上相近,实现原理是不同的)。
 
虽然你们的讨论没有给我太大帮助,不过还是谢谢你们的热情。
 
我靠!一刀,你倒是把东西拿出来瞧,不要推三托四的
你那篇文章再没下文,我要骂人啦
RTTI不是问题,Interface也不是问题,单根结构更不是问题
关键在于虚拟构造函数
光是指手划脚,不拿点真凭实据出来,凭什么让人家相信你?
你瞧:能够和温柔一刀和左轻候等数位高人讨论问题,真是感到非常的荣幸
我脸上都挂不住了,你还挂得住?

回到正题,关于用Delphi实现模板功能,从我的水平来看是做不到
用starfish说的方法恐怕也做不到
那种方法虽然能够实现线性表的管理,但做不到对元素的一些操作(比较之类的)

我正在看清华出的《数据结构(用C++和面向对象方法描叙)》,
书中对所有的数据结构,都是使用模板类+运算符重载来表现
这种方法如果要用Delphi来做,我想破头也不知道该如何实现
如果有人能做到,俺悬赏200大元

BTW,我觉得starfish兄的这个问题结束得太快了点……
 
to 左:你这还不叫骂人? :-)
另外,我说的推荐文章是指“悟透Delphi”的若干章节,
那里面说的比我要讲的还详细,足够低档一阵了 :-)

不过这都是其他问题,现在我也回到正题:

to starfish:难道前面诸位的回答你都没看?
XiDao的第一个贴子就基本解释了你的问题(见上),我在这里再详细解释一下:

你所说的:
“比如你要写一个操纵线性表的函数,但是线性表的元素的类型要在调用该函数时才能确定”
当然是模版的典型用途,但是只要线性表的元素的类型都是对象类型,那么就可以使用TObject
来定义元素类型,同样可以实现“线性表的元素的类型要在调用该函数时才能确定”。
这就是为什么OP不需要模板概念。C++中就是因为没有单一基类,只能使用模板这种方式。

当然,还有一个问题,那就是C++的模板同样支持基本类型(“眉毛胡子一把抓”?),
这一点OP就无法直接支持了。不过,可以在元素类中包含一个Variant,
也就基本解决了,起码比你上面设想的方法简单的多。

to 左:你说的“书中对所有的数据结构,都是使用模板类+运算符重载来表现”,
当然是C++的特色,不过看了我上面写的,想必不会认为OP做不了吧,只是写出的代码样子不同罢了。
至于操作符重载嘛,至今褒贬不一,反正程序的样子是漂亮很多,不过我劝大家慎用。
而你所说的“这种方法”,主要是操作符重载的功劳,而与template无关吧。

问题结束了,我到来了精神,嘿嘿,这不就“拿出点东西来了”?东西不多,请海涵 :-)
 
后退
顶部