Delphi泛型导致IDE异常退出,泛型T如何转换为TObject?

shadowstar 2008-12-06 08:22:50
泛型还是不完善,没有C++方便,不过总算有了。

还不太了解,不知道哪里有这方面的资料学习一下。

代码比较多,还不知道究竟是哪一部分导致IDE异常退出,等我简化后再发上来。

我希望使泛型T是一个继承于我写的一个基类TMyObject的一个类型,不知道怎么实现?

在里面用到 TMyObject(_T).Free; 之类的方法,但是不管怎么转换都不行。
...全文
310 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowstar 2008-12-10
  • 打赏
  • 举报
回复
楼上说的没错,我的意思就是说类型转换是有必要的,而且Delphi也提供了很多方法。

引用
实际上无所谓类型转换,除非转换为基类(事实上并没有必要)。
ZuoBaoquan 2008-12-10
  • 打赏
  • 举报
回复
建议楼主看看Delphi2009的帮助“Delphi Language Guide”,里面讲的很详细。
你说的实际上是泛型里面的约束(Constraint)。

比如Generics.Collections单元里面:
TObjectList<T: class> = class(TList<T>)
//...
end;
就表示必须实例化一个类(Class),如:
fList: TObjectList<TMyObject>;
// 如果定义为TObjectList<Integer>就会出错

还可以指定一个基类型,比如:
TGenerics<T: TMyObject> = class
private
f: T;
end;
此时f可以直接使用TMyObject的方法和成员。

另外,RTL里面提供了Default()函数,可以获得某种类型T的默认值。

Collections.Default里面有一些通用接口可以使用。

另外,通过TypeInfo()也可以获取T的类型信息。

shadowstar 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 unsigned 的回复:]
对于泛型,实际上属于一个类强类型,在定义的时候是什么类型,那么当中所用到的就必定是什么类型,实际上无所谓类型转换,除非转换为基类(事实上并没有必要)。
[/Quote]
如果定义的时候没有指定类型呢?
可能是简单类型,也可能是record/class/interface...
shadowstar 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 unsigned 的回复:]
引用 7 楼 shadowstar 的回复:
只有楼上说到点子上,我先实验一下。

回楼上其他各位:不是Free的问题,而是类型转换的问题,类型都转换不了怎么调用其中的函数。

TMyObject(_T).Free;这是类型强制转换,任何语言都有可能转换失败,包括C++,也只是推荐使用static_cast/dynamic_cast。类型转换必须要通过类型检查,而不是无所顾忌的强制转换。

6楼的方法,不过就是我在一楼当中说的类型限制。
[/Quote]
我要的就是限制。
TMyObject(_T).Free;这只是我举的例子,我的问题就是如何合理的转换。
僵哥 2008-12-09
  • 打赏
  • 举报
回复
对于泛型,实际上属于一个类强类型,在定义的时候是什么类型,那么当中所用到的就必定是什么类型,实际上无所谓类型转换,除非转换为基类(事实上并没有必要)。
僵哥 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shadowstar 的回复:]
只有楼上说到点子上,我先实验一下。

回楼上其他各位:不是Free的问题,而是类型转换的问题,类型都转换不了怎么调用其中的函数。
[/Quote]
TMyObject(_T).Free;这是类型强制转换,任何语言都有可能转换失败,包括C++,也只是推荐使用static_cast/dynamic_cast。类型转换必须要通过类型检查,而不是无所顾忌的强制转换。

6楼的方法,不过就是我在一楼当中说的类型限制。
shadowstar 2008-12-09
  • 打赏
  • 举报
回复
try__again

泛型在哪?
try__again 2008-12-09
  • 打赏
  • 举报
回复
type 
TTest = class(TMyObj)
end;


var
xx: TTest;
begin
if xx is TMyObj then
begin
(xx as TMyObj).free;
end;
end;

shadowstar 2008-12-09
  • 打赏
  • 举报
回复
只有楼上说到点子上,我先实验一下。

回楼上其他各位:不是Free的问题,而是类型转换的问题,类型都转换不了怎么调用其中的函数。
zplinze 2008-12-09
  • 打赏
  • 举报
回复
Delphi泛型如果不加限定的话,T可以是任意的类型,包括值类型如integer等,还有自定义的record,class
如果希望T是class这样的引用类型,可以用<T: Class>进行限定
如果要在泛型类内部调用T的构造函数,可以用<T: contructor>限定
也可以限定T是某个类或它的派生类。<T: TMyClass>,这样可以使用TMyClass的public fields

[Quote=引用 13 楼 shadowstar 的回复:]

如果定义的时候没有指定类型呢?
可能是简单类型,也可能是record/class/interface...
[/Quote]
shadowstar 2008-12-09
  • 打赏
  • 举报
回复
定义成Variant那泛型还有什么意义?

再说Variant也不是万能的
budded 2008-12-09
  • 打赏
  • 举报
回复
那就定义成Variant
zplinze 2008-12-08
  • 打赏
  • 举报
回复
你在定义泛型类的时候可以这么定义

TGenericType<T: TMyClass> = class
//blablabla...
end;

在TGenericType类的内部可以使用TMyClass的public field
starluck 2008-12-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 shadowstar 的帖子:]
泛型还是不完善,没有C++方便,不过总算有了。

还不太了解,不知道哪里有这方面的资料学习一下。

代码比较多,还不知道究竟是哪一部分导致IDE异常退出,等我简化后再发上来。

我希望使泛型T是一个继承于我写的一个基类TMyObject的一个类型,不知道怎么实现?

在里面用到 TMyObject(_T).Free; 之类的方法,但是不管怎么转换都不行。
[/Quote]

__T 如果是類的話的,如何FREE都沒有問題吧。

是不是其它問題影響的。

budded 2008-12-08
  • 打赏
  • 举报
回复
_T转换成什么类型的类去Free都是没什么问题的,
除非_T就单纯的是个指针,但指向的是自己分配的内存,要不_T是个野指针
shadowstar 2008-12-07
  • 打赏
  • 举报
回复
shadowstar 2008-12-06
  • 打赏
  • 举报
回复
Free只是我举的一个例子,可能是别的函数,比如GetValue,还有赋值等。

我原来的程序是没有泛型的,我只是做一个实验,学习一下泛型,并非要解决工作中的问题。
僵哥 2008-12-06
  • 打赏
  • 举报
回复
不清楚具体是如何写的.

TMyObject(_T).Free这本来就是有问题的.有几种方法处理:
1.限制T只能为TObject的超类(这样的话,似乎就没有使用泛型的必要了;
2.直接调用_T.Free,如此使得编译器直接就会检查_T是否拥有Free方法,不过建议写成_T.Free()
3.修改代码 if _T is TObject then _T.Free(),其实这有点画蛇添足的感觉,实际上跟1差不多了,可能会导致record等无法使用.
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧