2016-11-02 5 views
3

У меня есть код, как это:типов Generics называющих

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; 

Проблема в процедуре Execute, когда я хочу поместить аргументы fOnMsgFromServer. «helper» показывает мне (Arg1: string; Arg2: string; Arg3: string), и я просто не знаю, какой параметр есть.

Существует какое-либо решение, чтобы назвать эти аргументы?

ответ

7

Вы не можете избежать этих общих имен, если используете общий тип TProc<T1,T2,T3>. Его декларация выглядит так:

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; 
+0

Так что в случае словаря или списка невозможно? dict: TDictionary <строка, строка>? – aQuu

+2

Ну, это тип, а не процедура. Таким образом, параметры являются типами, а не аргументами. В любом случае типам присваиваются значащие имена заполнителей. Этот тип - 'TDictionary '. И тогда методы используют это. Например, 'procedure Add (const Key: TKey; const Value: TValue);' Но в любом случае это совсем другое дело, чем то, что вы здесь задали. –