- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经开始在 Delphi 2010 中使用泛型,但在编译这段代码时遇到问题:
TThreadBase = class( TThread )
...
end;
TThreadBaseList<T: TThreadBase> = class( TObjectList<T> )
...
end;
TDataProviderThread = class( TThreadBase )
...
end;
TDataCore = class( TInterfacedObject, IDataCore )
private
FProviders: TThreadBaseList<TDataProviderThread>;
...
end;
然后我有一些嵌套过程:
procedure MakeAllThreadsActive(aThreads: TThreadBaseList<TThreadBase>);
begin
...
end;
最后我想在 TDataCore 类的代码中调用这个嵌套过程:
MakeAllThreadsActive(FProviders);
但是编译器不想编译它,它说('<>'括号被'()'替换):
[DCC Error] LSCore.pas(494): E2010 Incompatible types: 'TThreadBaseList(TThreadBase)' and 'TThreadBaseList(TDataProviderThread)'
虽然 TDataProviderThread 是 TThreadBase 的后代,但我不明白。
我必须通过硬类型转换来修复它:
MakeAllThreadsActive(TThreadBaseList<TThreadBase>(FProviders));
有人知道为什么编译器会出现这个错误吗?
最佳答案
TDataProviderThread 是 TThreadBase 的后代,但是 TThreadBaseList<TDataProviderThread>
不是 TThreadBaseList<TThreadBase>
的后代。这不是继承,它被称为协方差,虽然直观上看起来像是同一件事,但事实并非如此,它必须单独支持。目前,Delphi 不支持它,但希望在未来的版本中会支持它。
这是协方差问题的基本原因:如果您传递给它的函数需要一个 TThreadBase 对象列表,并且您向它传递一个 TDataProviderThread 对象列表,则没有什么可以阻止它调用 .Add 并粘贴一些其他对象将 TThreadBase 对象添加到不是 TDataProviderThread 的列表中,现在您遇到了各种丑陋的问题。您需要编译器使用特殊技巧来确保这种情况不会发生,否则您将失去类型安全性。
编辑:这是一个可能的解决方案:将 MakeAllThreadsActive 设为通用方法,如下所示:
procedure MakeAllThreadsActive<T: TThreadBase>(aThreads: TThreadBaseList<T>);
或者你可以按照 Uwe Raabe 的建议去做。任何一种都可以。
关于delphi - 为什么 TGeneric<Base> 和 TGeneric<Descendant> 类型不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687755/
我希望能够选择类 zz 的所有元素,这些元素是类 xx 的元素的后代,但不是类 yy 的后代。 考虑以下几点: ... arbitrary depth ...
给定以下 HTML: li > a { color: black } ul a { color: black } 最佳答案 The most fundamental conc
假设树结构如下:(丑陋的遗留布局,抱歉) (1) dont want to select this one
这是我的 RadixSort 函数(升序): void RadixSort (int a[], int n) { int i, m=0, exp=1, b[MAX]; for (i=0
我有以下 SP CREATE PROCEDURE GetAllHouses set @webRegionID = 2 set @sortBy = 'case_no' set @
我知道你实际上无法从记录中继承任何内容,但我不知道如何用一句话总结我的问题。如果需要,请编辑标题。 我在这里想做的是创建一个某种泛型类型的数组,它可以是 X 种类型之一,该数组将填充这些自定义类型(它
我正在尝试将 Silverlight DataGrid 绑定(bind)到 WCF 服务调用的结果。我没有看到网格中显示的数据,所以当我运行调试器时,我注意到 XDocument.Descendant
我有一个简单的 XML, 我想找到所有“H”节点。 XElement x = XElement.Parse(""); IEnumerable h = x.Descendants("H"); if (
使用 beautifulsoup 时 soup.descendants迭代器,生成的标签是否保证以任何特定顺序返回?由于文档提到事物是递归迭代的,所以我猜测事物是按 DFS 顺序返回的,但我不确定这是
我无法弄清楚如何更新一行的后代/子代。示例表,命名为 test +----+--------+------+ | Id | Parent | Val | +----+--------+------+
我遇到了这样的情况:我需要在页面上选择不同的节点组,并且需要排除某些子元素。我最常见的任务是选择所有 元素,但不是某些元素的后代。 以我的 fiddle 为例:http://jsfiddle.net/
链接: http://jsbin.com/EFAlace/3/edit?html,css,output HTML: Hover over me! Weird link
你好,有一个像这样的 DOM,需要选择除 div.hidden 部分的后代元素之外的所有 a 元素。 Some text Email Alex Some more text
这个问题在这里已经有了答案: Is the CSS :not() selector supposed to work with distant descendants? (2 个答案) 关闭 5 年
6000 7000 2 5 3 6 9
XElement.Descendants () 方法接受要查找的元素的名称。 但是它是区分大小写的,有没有办法让它不区分大小写 最佳答案 你可以使用这个: element.Descendants()
我正在使用 React 路由器 dom Link 组件。它基本上是推特的主页。我希望能够在一个 div 组件中有两种类型的链接。一个是链接到用户的个人资料,另一个是发布。我目前收到警告,暂时找不到解决
是否有推荐的模式将 props 传递给 React 中的后代组件? 下面,我将 propcallback 传递给子组件: Master = React.createClass({ render:
在使用Selenium定位网页中的元素时,我使用了很多XPath,并且最近从使用node1 // node2转向使用node1 / descendant::node2。两种方法有什么区别?一个比另一个
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭13 年前。 Improve th
我是一名优秀的程序员,十分优秀!