通过库代码传递对象时避免转换(在Delphi中)

通过库代码传递对象时避免转换(在Delphi中),第1张

概述在设计库时,我经常会采用以下模式,我不喜欢这种模式,因为它导致大量的类型转换. 基本模式是: 使用库的代码将对象传递给库,然后库将对象移回给调用代码.强制调用代码转换对象,因为库提交了泛型类型. (下面的简化代码示例) 该库定义了以下对象和功能: TThing = ClassEnd;TThingProcessor = ClassPublic Function CreateThin 在设计库时,我经常会采用以下模式,我不喜欢这种模式,因为它导致大量的类型转换.

基本模式是:
使用库的代码将对象传递给库,然后库将对象移回给调用代码.强制调用代码转换对象,因为库提交了泛型类型. (下面的简化代码示例)

该库定义了以下对象和功能:

TThing = ClassEnd;TThingProcessor = ClassPublic    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 anythingEnd;

处理器类也是一个TThing工厂.该库保证它只会将TThings传递给创建它们的相应TThingProcessor,因此它可以工作,但不是类型安全的.虽然上面的代码有点愚蠢,因为它实际上没有做任何事情,但它说明了为什么Processthing不能简单地转移到TThing并且是多态的 – 需要更新XSum变量.

如何重构代码以便不需要演员?我需要保持库代码分开,但能够接受任何类型.

编辑:
由于建议,将强制转换更改为as-cast,因此在类型不匹配的情况下,它至少会抛出异常而不是崩溃

解决方法 你在使用Delphi 2009吗?这对于泛型非常有用.将您的声明更改为:

TThingProcessor<T: TThing> = ClassPublic    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;

没有更多的铸造.

总结

以上是内存溢出为你收集整理的通过库代码传递对象时避免转换(在Delphi中)全部内容,希望文章能够帮你解决通过库代码传递对象时避免转换(在Delphi中)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1258591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存