加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

通过库代码传递对象时避免转换(在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变量.

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

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

解决方法

你在使用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;

没有更多的铸造.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读