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

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

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

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

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

在里面用到 TMyObject(_T).Free; 之类的方法,但是不管怎么转换都不行。
...全文
373 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等无法使用.
内容概要:本文提出了一种基于蒙特卡洛模拟与拉格朗日松弛法的分散式优化策略,用于解决电动汽车充电站在分时电价机制下的有序充电调度问题。通过蒙特卡洛方法模拟电动汽车充电行为的随机性,生成多样化负荷场景,构建以降低电网负荷波动和用户充电成本为目标的优化模型;采用拉格朗日松弛法对耦合约束进行解耦,实现分布式求解,在保障用户隐私的同时提升计算效率。文中设计了详细的仿真场景,系统分析了该调度策略对电网负荷特性和用户经济性的影响,验证了所提方法在实际应用中的有效性与可行性。; 适合人群:具备电力系统运行、优化算法理论及Matlab编程能力的研究生、科研人员以及从事智能电网与电动汽车相关领域的工程技术人员。; 使用场景及目标:①应用于城市规模化充电站集群的有序充电管理,实现电网“削峰填谷”;②为电力公司制定科学合理的分时电价政策提供量化分析工具;③支撑智能电网中需求侧资源的分布式协同优化调度研究与系统设计。; 阅读建议:建议结合提供的Matlab代码深入理解算法实现流程,重点掌握蒙特卡洛场景生成机制与拉格朗日松弛迭代求解过程,可通过调整参数设置复现不同工况下的仿真结果,以深化对分散式优化机制与调度效果之间关系的理解。
内容概要:本文研究了基于元胞神经网络配流与DQN强化学习的公交线网扰动韧性恢复方法,旨在应对公共交通系统中突发事件导致的网络扰动问题。通过结合元胞神经网络对交通流量进行精细化建模与分配,并利用深度Q网络(DQN)强化学习算法动态优化调度策略,实现公交线路在扰动后的快速恢复与运力再分配。研究构建了完整的仿真框架,在Matlab平台上实现了算法的编码与测试,验证了所提方法在提升公交系统韧性、减少乘客延误和优化资源利用方面的有效性。; 适合人群:具备一定交通工程、智能算法或强化学习基础,从事智慧交通、城市公交调度、韧性城市等方向研究的研究生、科研人员及工程技术开发者。; 使用场景及目标:①应用于城市公交系统在遭遇突发事件(如道路封闭、车辆故障、极端天气)时的应急调度与恢复决策;②为智能交通系统(ITS)提供基于AI的动态配流与优化控制方案;③推动强化学习在复杂交通网络管理中的落地实践; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注元胞神经网络的状态转移机制与DQN奖励函数的设计逻辑,并可通过调整扰动场景参数进行仿真实验,以掌握模型的适应性与优化潜力。

16,741

社区成员

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

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