【问题标题】:Generics types naming泛型类型命名
【发布时间】:2016-11-02 16:38:09
【问题描述】:

我有这样的代码:

TServer = class
private
    fOnMsgFromServer: TProc<String, String, String>;
public
    procedure RegisterOnMsgFromServer(aCallBack: TProc<String, String, String>);
    procedure Execute;
end;

procedure TServer.RegisterOnMsgFromServer(aCallBack: TProc<String, String, String>);
begin
    fOnMsgFromServer := aCallBack;
end;

procedure TServer.Execute;
begin
    fOnMsgFromServer('userName', 'password', 'message');
end;

当我想将参数放入 fOnMsgFromServer 时,问题出在过程执行中。 “helper”显示我(Arg1:字符串;Arg2:字符串;Arg3:字符串),我只是不知道哪个参数是哪个。

有任何解决方案来命名这个参数?

【问题讨论】:

    标签: delphi generics naming-conventions


    【解决方案1】:

    如果您使用泛型 TProc&lt;T1,T2,T3&gt; 类型,则无法避免使用这些泛型名称。它的声明如下所示:

    type
      TProc<T1,T2,T3> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3);
    

    如您所见,这就是名称的来源。如果你使用这种类型,你就会被这些名字困住。

    相反,您应该声明一个定制的引用过程类型,而不是使用泛型类型。这不仅可以让您为参数赋予有意义的名称,还可以让您停止一遍又一遍地重复自己。

    type
      TMsgFromServerProc = reference to procedure(UserName, Password, Msg: string);
    
      TServer = class
      private
        fOnMsgFromServer: TMsgFromServerProc;
      public
        procedure RegisterOnMsgFromServer(aCallBack: TMsgFromServerProc);
      end;
    

    【讨论】:

    • 那么在字典或列表的情况下是不可能的?字典:TDictionary ?
    • 嗯,这是一个类型而不是一个过程。所以参数是类型而不是参数。在任何情况下,类型都会被赋予有意义的占位符名称。该类型是TDictionary&lt;TKey,TValue&gt;。然后方法利用了这一点。例如,procedure Add(const Key: TKey; const Value: TValue); 但无论如何,这和你在这里问的完全不同。
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2011-02-05
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多