我正在使用Delphi 2010,我有一个单元,多年来我添加了自己的程序和功能,可以用于我所做的任何项目,例如:
function ListBoxIsSelected(ListBox: TListBox): Boolean;
begin
Result:= ListBox.ItemIndex <> -1;
end;
Run Code Online (Sandbox Code Playgroud)
上面的用途TListBox作为参数,所以只要使用上述功能我必须提供一个listbox即是TListBox类.
现在假设我有一些其他组件库可以使用相同的函数,例如Jedi组件类.
我怎么能使用上述功能,当绝地listbox是TJvListBox阶级和我的功能是寻找TListBox类?虽然两个组件实际上是相同的,但类名是不同的.如果我专门为TJvListBox它提供相同的功能,它可能会起作用,因为它们都是"列表框":
function ListBoxIsSelected(ListBox: TJvListBox): Boolean;
begin
Result:= ListBox.ItemIndex <> -1;
end;
Run Code Online (Sandbox Code Playgroud)
现在,我需要将组件作为参数传递,以相同的方式编写完整的过程和函数.只是为了使用不同的组件类而不得不重写它们是不可行的!
我怎么能用泛型写这个?
你不能用泛型来编写它,除非你的目标类当然都来自同一个基类.(但那时你不需要泛型.)
如果你真的想要一些可以检查任何对象<> -1 上的ItemIndex属性的东西,你可以使用不同的Delphi 2010功能:扩展RTTI.
uses
SysUtils, RTTI;
function IsSelected(item: TObject): boolean;
var
context: TRttiContext;
cls: TRttiType;
prop: TRttiProperty;
ItemIndex: integer;
begin
if item = nil then
raise Exception.Create('Item = nil');
context := TRttiContext.Create;
cls := context.GetType(item.ClassType);
prop := cls.GetProperty('ItemIndex');
if prop = nil then
raise Exception.Create('Item does not contain an ItemIndex property.');
ItemIndex := prop.GetValue(item).AsInteger;
result := ItemIndex <> -1;
end;
Run Code Online (Sandbox Code Playgroud)
但是要小心.这里没有编译时类型检查,这个过程明显慢于原始例程.你可能不会注意到它,但如果你在紧密的循环中调用这样的东西,它会减慢速度.
\n\n\n我不明白如何用泛型来写这个?
\n
您不能\xe2\x80\x99t \xe2\x80\x93 除非您的组件实现公共接口或从具有标准的公共基类继承ListBox,并且该接口/基类提供该ItemIndex属性。
事实上,这个用例并不是一个很好的泛型示例,因为在声明中使用接口或基类也同样有效。
\n| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |