Delphi通用约束问题

2024-03-11

我正在尝试创建一个与 tiOPF (delphi @ www.tiopf.com 的对象持久框架)一起使用的通用列表类。具体来说,我试图采用现有的泛型类 (TtiObjectList) 并制作一个使用 TtiObject 后代的泛型版本。

我更改基类的范围有限,因为它们需要在 D7 - D2009 和 Free Pascal 下编译。我需要从 TtiObjectList 下降以保持现有的持久性机制正常工作。

// base class  
type  
  TtiObjectList = class(TtiObject)
...  
protected  
  function GetItems(i: integer): TtiObject; virtual;  
  procedure SetItems(i: integer; const AValue: TtiObject); virtual;  
...  
public  
  function Add(const AObject : TtiObject): integer; overload; virtual;  
...  
end;  

我的类定义如下:

TtiGenericObjectList<T: TtiObject> = class(TtiObjectList)  
protected  
  function GetItems(i:integer): T; reintroduce;  
  procedure SetItems(i:integer; const Value: T); reintroduce;  
public  
  function Add(const AObject: T): integer; reintroduce;  
  property Items[i:integer]: T read GetItems write SetItems; default;  
end;

implementation

{ TtiGenericObjectList<T> }

function TtiGenericObjectList<T>.Add(const AObject: T): integer;  
var obj: TtiObject;  
begin  
  obj:= TtiObject(AObject); /// Invalid typecast
  result:= inherited Add(obj);  
end;  

// alternate add, also fails  
function TtiGenericObjectList<T>.Add(const AObject: T): integer;  
begin  
  result:= inherited Add(AObject); /// **There is no overloaded version**
 /// **of 'Add' that can be called with these arguments**  
end;  

function TtiGenericObjectList<T>.GetItems(i: integer): T;  
begin  
  result:= T(inherited GetItems(i)); /// **Invalid typecast  **
end;  

procedure TtiGenericObjectList<T>.SetItems(i: integer; const Value: T);  
begin  
  inherited SetItems(i, Value);  
end;  

我遇到的问题是 delphi 没有将 T 视为 TtiObject 后代。当我执行以下操作时,我收到无效的类型转换错误:

function TtiGenericObjectList<T>.Add(const AObject: T): integer;  
var obj: TtiObject;  
begin  
  obj:= TtiObject(AObject); /// **Invalid typecast***
  result:= inherited Add(obj);  
end;  

如果我不进行类型转换,则会出现重载错误,如上面的列表所示。

有什么想法我哪里出错了吗?

Sean


Delphi 2009 编译器在其泛型实现中存在一些非常严重的缺陷。它几乎不理解约束的含义,(Barry Kelly 在 SO 的其他地方承认了这一点;我不记得确切的位置,)并且跨单元泛型可能会导致非常奇怪的问题。最好的办法是根据具体情况来处理这个问题:如果您的代码可以编译,请使用它。如果没有,请返回非通用实现,直到他们修复它。希望我们能在不久的将来看到修复泛型(和 Generics.Collections 单元)的更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi通用约束问题 的相关文章

随机推荐

  • 生成位置周围的随机坐标

    我想要一个函数 它接受地理位置 纬度 经度 并生成周围的随机坐标集 但也将这些参数作为计算的一部分 要制作的随机坐标数 生成半径 随机坐标之间的最小距离 以米为单位 用于生成其周围位置的根坐标 生成方式的示例 实现这一目标的好方法是什么 生
  • 使用环境变量的 Maven 本地存储库

    如何使用环境用户变量设置 标记 我尝试了这条路 myRepo repo 但它不起作用 myRepo C maven repo 我无法使用绝对路径来解决可移植性问题 但我可以将 myRepo 设置到每个系统上的正确位置 其中绝对路径可能会有所
  • 我可以在本地测试 AWS Glue 代码吗?

    阅读 Amazon 文档后 我的理解是运行 测试 Glue 脚本的唯一方法是将其部署到开发端点并在必要时进行远程调试 同时 如果 Python 代码由多个文件和包组成 则除了主脚本之外的所有文件和包都需要压缩 这一切让我感觉 Glue 不适
  • 如何使用与其文件扩展名关联的程序打开文件?

    有没有一种简单的方法可以在Windows中通过其关联程序打开文件 就像在 Windows 资源管理器中双击它一样 但使用我的代码自动完成 例如 在计算机 A 上 text txt 将在写字板中打开 但在计算机 B 上 由于用户文件扩展名分配
  • Bootstrap - 选择和按钮彼此相邻

    我有一个
  • 我应该如何编写 .i 文件来包装 Java 或 C# 中的回调

    我的 C 程序使用定期调用的回调函数 我希望能够处理 Java 或 C 程序中的回调函数 我应该如何编写 i 文件来实现此目的 C 回调看起来像这样 static void on incoming call pjsua acc id acc
  • JDBI 的 @BindBean 在 INSERT 期间未在 bean 类中找到命名参数

    当使用 JDBI 的 BindBean 将值插入 Dropwizard 中的 Mysql 数据库时 我始终遇到以下异常 问题似乎是 JDBI 无法找到 bean 中的属性 我已经将该问题隔离到一个单独的项目中 但无法弄清楚哪里出了问题 我将
  • 在 HTML 上使用 setter 和 getter 变量(角度组件)

    我创建了一个简单的角度组件来测试使用 getter setter 样式的变量的使用情况 import Component from angular core Component selector my app templateUrl app
  • 仅隐藏滚动上的操作栏而不是操作栏选项卡

    我在向下滚动时尝试隐藏操作栏时遇到问题 然后在向上滚动时 必须再次显示操作栏 For Eg 我提到了这个Tutorial http www techrepublic com article pro tip maximize android
  • Android 12 上的 PendingIntent.FLAG_UPDATE_CURRENT 错误

    在我的应用程序中 我计划在每天的特定时间设置闹钟 为此 我正在使用警报管理器 请参阅下面的代码 这在 12 以下的 Android 设备上运行良好 但在 12 及更高版本上则不行 Firebase Crashlytics 上出现错误 以 S
  • 如何用CGPathAddCurveToPoint创建一个完美的半圆?

    我正在尝试使用 CGPathAddCurveToPoint 创建一个半径为 15 点的完美右半圆 如下所示 CGPathMoveToPoint path NULL 0 0 CGPathAddCurveToPoint path NULL 15
  • Google Chrome 扩展程序可在用户点击后关闭通知

    Chrome 扩展程序运行良好 我的问题是通知会在 7 秒后关闭 我想让用户点击关闭通知 function engine var latestId var ids var messages var newmessage get http l
  • git merge:将更改应用于移动到不同文件的代码

    我现在正在尝试一个非常强大的 git merge 操作 我遇到的一个问题是 我对分支中的某些代码进行了一些更改 但我的同事将该代码移动到了他分支中的新文件中 所以当我这样做的时候git merge my branch his branch
  • 使用 strptime() 解析日期/时间字符串时如何保留时区?

    我有一个来自 Blackberry IPD 备份的 CSV 转储文件 是使用 IPDDump 创建的 这里的日期 时间字符串看起来像这样 在哪里EST是澳大利亚时区 Tue Jun 22 07 46 22 EST 2010 我需要能够在 P
  • Arduino从SD卡读取最后一行

    我对 Arduino 业务还很陌生 如何从 SD 卡读取最后一行 通过以下代码片段 我可以读取第一行 n 之前的所有字符 现在我想添加一个 向后 声明 或其他内容 到目前为止我的代码 include
  • 寻找 Wii 兼容的 Javascript Flash mp3 播放器

    我正在寻找一款能够在 Wii 上基于 Opera 的浏览器中运行的 flash mp3 播放器 播放器需要启用 javascript 支持播放 停止等方法 mp3 曲目列表将使用与播放器相同的页面上的 ajax 动态构建 因此当曲目完成播放
  • Android:在 Android 设备选择器中,同一设备会出现多次

    我正在使用 Eclipse 为 Android 操作系统编程 我使用真实设备来测试我的应用程序 为了测试我的应用程序 我单击 运行 然后单击我想要运行的目标项目 然后弹出 Android 设备选择器 我可以在其中选择要运行该应用程序的设备或
  • 脚本标签中的文本属性 - 澄清?

    在阅读 Angular 的指令代码时 我看到this https github com angular angular js blob master src ng directive script js L43 var scriptDire
  • SVG 在视网膜屏幕上作为边框图像

    请考虑我们有简单的 SVG 文件 其中包含圆角半径等于 10 的圆角矩形的代码
  • Delphi通用约束问题

    我正在尝试创建一个与 tiOPF delphi www tiopf com 的对象持久框架 一起使用的通用列表类 具体来说 我试图采用现有的泛型类 TtiObjectList 并制作一个使用 TtiObject 后代的泛型版本 我更改基类的