【问题标题】:How to use generics as a replacement for a bunch of overloaded methods working with different types?如何使用泛型代替一堆使用不同类型的重载方法?
【发布时间】:2018-01-24 12:58:15
【问题描述】:

我有一堆重载的方法,它们都获取某种类型的数组作为参数,并从该数组中返回一个随机值:

function GetRandomValueFromArray(Arr: array of String): String; overload;
begin
     Result := Arr[Low(Arr) + Random(High(Arr) + 1)];
end;

function GetRandomValueFromArray(Arr: array of Integer): Integer; overload;
begin
     Result := Arr[Low(Arr) + Random(High(Arr) + 1)];
end;

等等

如何使用泛型为任何类型的数组创建单一方法?像这样的东西(在 Delphi XE7 中无法编译):

function GetRandomValueFromArray(Arr: TArray<T>): <T>;

感谢任何意见,因为我阅读了大多数关于泛型的问题,但我仍然不清楚这是否可能?

【问题讨论】:

    标签: delphi generics delphi-xe7


    【解决方案1】:

    要使用泛型函数,您必须将其转换为类的方法(以我的拙见,这是一个奇怪的限制)。注意class函数不需要创建TDummy的实例

    TDummy = class
      class function GetRandomValueFromArray<T>(const Arr: TArray<T>): T;
    end;
    
    class function TDummy.GetRandomValueFromArray<T>(const Arr: TArray<T>): T;
    begin
      Result := Arr[Low(Arr) + Random(High(Arr) + 1)];
    end;
    
    intValue := TDummy.GetRandomValueFromArray<Integer>([1,3,5]);
    

    【讨论】:

    • 非常感谢您快速、专业的回答。 > 类函数 GetRandomValueFromArray(const Arr: TArray): T;不是很明显的语法。
    • 我想要的 Delphi 功能之一是全局泛型函数,即不需要它们是类的(静态)方法。
    • FWIW, Arr[Low(Arr) + Random(Length(Arr))] 会达到同样的效果。对于 dynarrays,Low(Arr) 始终为 0,因此 Arr[Length(Arr)] 也可以。
    • 技术上const arr: array of T 是正确的签名,因为问题也有开放数组参数而不是动态数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多