本帖最后由 HiLoveS 于 2009-06-18 22:47:21 编辑

解决方案 »

  1.   

    d2009开始支持泛型,但是只有class/record/interface中的函数可以带泛型,普通的函数不支持泛型语法
      

  2.   

    我说的就是D2009,刚才试了一下,在类中写一个类函数就可以达成上面的效果
    type
      test<T> = class
        class function AddValue(a,b : T):T;static;
      end;class function test<T>.AddValue(a,b : T):T;
    begin 
      result := a + b; 
    end;
      

  3.   

    你的泛型的具体类型必须支持你所表示的运算才行。
    比如:如果具体类型是 integer,当然 a+b可以运算。
    但如果具体类型传入了TButton, buttona+buttonby应该等于什么呢?不会是doublebutton吧,哈哈。
    这里要求传入的类实现了所需要的运算重载。
      

  4.   

    理解错误.
    到底+代表了什么是你决定的,不是具体类型决定的.
    泛型中对+是一种抽象,具体代表什么只有你才有决定权.
    buttona+buttonby返回doublebutton或者2button,或者其他什么的都可以.但是前提是,是不是有意义.
    如果buttona+buttonby返回doublebutton你认为是对的,那么对于你来说就是有意义的,那么buttona+buttonby也不是什么无稽之谈,也是正确的.
      

  5.   

    运算符的重载实现的意义取决于代码的实现,没有特别的要求。
    比如:
    你自己定义 Integer类,重载+让他实现减法的操作
    让Int5+Int4=Int1,那是当然是可以的。
    但有个基本的准则,实现的操作意义应该同现有的习惯一致,不然后期代码维护将非常困难
      

  6.   

    结贴了,a+b这段不能通过编译,但这不是这帖的重点,本帖重点是如何写一个泛型函数,下面的发言有点跑题。现在只有Delphi 2009支持泛型,但只支持类、record、interface使用泛型,无法支持C++类的普通泛型函数。function SetValue <T>(a : T):T; 
    begin 
      result := a; 
    end;这种普通函数无法使用泛型。但是可以用使用类函数的类来代替,效果差不多。
    type 
      test<T> = class 
        public
          class function SetValue(a : T):T; 
      end; class function test<T>.SetValue(a : T):T; 
    begin 
      result := a; 
    end;var
      b,c : Integer;
    begin
      c := 100;
      b := test<Integer>.SetValue(c);
    end.T可以放很多类型。