Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在delphi中实现类函数的泛型化_Delphi_Generics_Delphi Xe_Delphi Xe4 - Fatal编程技术网

如何在delphi中实现类函数的泛型化

如何在delphi中实现类函数的泛型化,delphi,generics,delphi-xe,delphi-xe4,Delphi,Generics,Delphi Xe,Delphi Xe4,我有一个基类和从该类派生的10个类。基类包含一个函数,该函数除了对象的过程类型的参数外。像这样 mytype = procedure (a : integer) of object; baseclass = class public procedure myproc(cont handler : mytype ) ; end; procedure baseclass.myproc(cont handler : mytype ) ; begin // do somethin

我有一个基类和从该类派生的10个类。基类包含一个函数,该函数除了对象的
过程类型的参数外
。像这样

 mytype = procedure (a : integer) of object;

 baseclass = class
 public
   procedure myproc(cont handler : mytype ) ;
 end; 
 procedure baseclass.myproc(cont handler : mytype ) ;
 begin
 // do something
 end;
我在派生类中重载此函数,即派生类包含相同的函数,但具有不同的参数(对象的过程(const handler:integer))。像这样

 base1mytype = procedure (a : string) of object; 

 derivedclass1 = class(baseclass)
 public
   procedure myproc(cont handler : base1mytype ) ;overload;
 end;

 base2mytype = procedure (a : boolean) of object; 
 derivedclass1 = class(baseclass)
 public
   procedure myproc(cont handler : base2mytype ) ;overload;
 end;
等等

我只需要一个实现这个函数的泛型类,然后从这个函数派生我的类

   mytype = procedure (a : integer) of object;
    baseclass<T> = class
    public
      procedure myproc(cont handler : T) ;
    end; 
   procedure baseclass<T>.myproc(cont handler : T ) ;
   begin
   // do something
   end;
  and derive classes are like this

deriveclass1  = class<baseclass <string>>
  public
    procedure myproc(cont handler : T) ;
  end;
mytype=对象的过程(a:整数);
基类=类
公众的
程序myproc(cont handler:T);
结束;
过程基类.myproc(cont处理程序:T);
开始
//做点什么
结束;
派生类是这样的
deriveclass1=类
公众的
程序myproc(cont handler:T);
结束;

由于泛型约束不支持对象过程的类型约束,因此需要具有内部类型定义的泛型类:

type
  TBaseClass<T> = class
  public
    type
      THandler = procedure(Arg: T) of object;
  public
    procedure CallHandler(Handler: THandler; Arg: T);
  end;

procedure TBaseClass<T>.CallHandler(Handler: THandler; Arg: T);
begin
  Handler(Arg);
end;
类型
TBaseClass=类
公众的
类型
THandler=对象的过程(Arg:T);
公众的
过程调用处理程序(处理程序:THandler;Arg:T);
结束;
过程TBaseClass.CallHandler(处理程序:THandler;Arg:T);
开始
处理程序(Arg);
结束;

您需要一个具有内部类型定义的泛型类:

type
  TBaseClass<T> = class
  public
    type
      THandler = procedure(Arg: T) of object;
  public
    procedure CallHandler(Handler: THandler; Arg: T);
  end;

procedure TBaseClass<T>.CallHandler(Handler: THandler; Arg: T);
begin
  Handler(Arg);
end;
类型
TBaseClass=类
公众的
类型
THandler=对象的过程(Arg:T);
公众的
过程调用处理程序(处理程序:THandler;Arg:T);
结束;
过程TBaseClass.CallHandler(处理程序:THandler;Arg:T);
开始
处理程序(Arg);
结束;

您需要一个具有内部类型定义的泛型类:

type
  TBaseClass<T> = class
  public
    type
      THandler = procedure(Arg: T) of object;
  public
    procedure CallHandler(Handler: THandler; Arg: T);
  end;

procedure TBaseClass<T>.CallHandler(Handler: THandler; Arg: T);
begin
  Handler(Arg);
end;
类型
TBaseClass=类
公众的
类型
THandler=对象的过程(Arg:T);
公众的
过程调用处理程序(处理程序:THandler;Arg:T);
结束;
过程TBaseClass.CallHandler(处理程序:THandler;Arg:T);
开始
处理程序(Arg);
结束;

您需要一个具有内部类型定义的泛型类:

type
  TBaseClass<T> = class
  public
    type
      THandler = procedure(Arg: T) of object;
  public
    procedure CallHandler(Handler: THandler; Arg: T);
  end;

procedure TBaseClass<T>.CallHandler(Handler: THandler; Arg: T);
begin
  Handler(Arg);
end;
类型
TBaseClass=类
公众的
类型
THandler=对象的过程(Arg:T);
公众的
过程调用处理程序(处理程序:THandler;Arg:T);
结束;
过程TBaseClass.CallHandler(处理程序:THandler;Arg:T);
开始
处理程序(Arg);
结束;

我还没有阅读所有这些内容,但我注意到您的代码不是真正的代码。例如,“cont”不是有效的关键字。请发布真实代码,而不是您在web浏览器中键入的内容。我知道“const”的意思,但它表明你没有从编辑器中复制它,而是徒手将它输入到浏览器中。这经常会引入错误,混淆了真实和真实的问题。我还没有阅读所有这些,但我注意到你的代码不是你真正的代码。例如,“cont”不是有效的关键字。请发布真实代码,而不是您在web浏览器中键入的内容。我知道“const”的意思,但它表明你没有从编辑器中复制它,而是徒手将它输入到浏览器中。这经常会引入错误,混淆了真实和真实的问题。我还没有阅读所有这些,但我注意到你的代码不是你真正的代码。例如,“cont”不是有效的关键字。请发布真实代码,而不是您在web浏览器中键入的内容。我知道“const”的意思,但它表明你没有从编辑器中复制它,而是徒手将它输入到浏览器中。这经常会引入错误,混淆了真实和真实的问题。我还没有阅读所有这些,但我注意到你的代码不是你真正的代码。例如,“cont”不是有效的关键字。请发布真实代码,而不是您在web浏览器中键入的内容。我知道“const”的意思,但它表明你没有从编辑器中复制它,而是徒手将它输入到浏览器中。我不小心按下了“不接受”按钮,非常感谢你的帮助我不小心按下了“不接受”按钮,非常感谢你的帮助我不小心按下了“不接受”按钮,非常感谢你的帮助我不小心按下了“不接受”按钮,非常感谢你的帮助我不小心按下了“不接受”按钮,非常感谢你的帮助