通过库代码传递对象时避免转换(在Delphi中)
发布时间:2020-12-15 09:26:39 所属栏目:大数据 来源:网络整理
导读:在设计库时,我经常会采用以下模式,我不喜欢这种模式,因为它导致大量的类型转换. 基本模式是: 使用库的代码将对象传递给库,然后库将对象移回给调用代码.强制调用代码转换对象,因为库提交了泛型类型. (下面的简化代码示例) 该库定义了以下对象和功能: TThing
在设计库时,我经常会采用以下模式,我不喜欢这种模式,因为它导致大量的类型转换.
基本模式是: 该库定义了以下对象和功能: TThing = Class End; TThingProcessor = Class Public Function CreateThing : TThing; Virtual; Abstract; Procedure ProcessThing (Thing : TThing); Virtual; Abstract; End; Procedure DoEverything (Processor : TThingProcessor); 然后调用代码通过覆盖对象并调用DoEverything来使用库,如下所示 – TMyThing = Class(TThing) Public X : Integer; End; TMyThingProcessor = Class(TThingProcessor) Public XSum : Integer; Function CreateThing : TThing; Override; Procedure ProcessThing (Thing : TThing); Override; End; Function TMyThingProcessor.CreateThing : TThing; Begin Result := TMyThing.Create; End; Procedure TMyThingProcessor.ProcessThing (Thing : TThing); Begin XSum := XSum + (Thing As TMyThing).X; //Here is the problem,the caller is forced to cast to do anything End; 处理器类也是一个TThing工厂.该库保证它只会将TThings传递给创建它们的相应TThingProcessor,因此它可以工作,但不是类型安全的.虽然上面的代码有点愚蠢,因为它实际上没有做任何事情,但它说明了为什么ProcessThing不能简单地转移到TThing并且是多态的 – 需要更新XSum变量. 如何重构代码以便不需要演员?我需要保持库代码分开,但能够接受任何类型. 编辑: 解决方法
你在使用Delphi 2009吗?这对于泛型非常有用.将您的声明更改为:
TThingProcessor<T: TThing> = Class Public Function CreateThing : T; Virtual; Abstract; Procedure ProcessThing (Thing : T); Virtual; Abstract; End; TMyThingProcessor = Class(TThingProcessor<TMyThing>) Public XSum : Integer; Function CreateThing : TMyThing; Override; Procedure ProcessThing (Thing : TMyThing); Override; End; 没有更多的铸造. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |