Делегаты в PascalABC.NET.


#1

Здравствуйте! Я разрабатываю модуль в PascalABC.NET, и мне необходимо реализовать делегатов из C# примерно такого формата:

public delegate void DataMessageReceivedHandler(object sender, ProtocolMessageEventArgs eventArgs);

public delegate void AnalogReceivedHandler(object sender, ProtocolEventArgs eventArgs);

public delegate void DigitalReceivedHandler(object sender, ProtocolEventArgs eventArgs);

Подскажите, пожалуйста, как объявить таких делегатов в PascalABC.NET? В справке информации не нашёл. Буду благодарен за помощь.


#2

Всё довольно просто:

type
  Delegate1Name = procedure(arg1: byte);
  Delegate2Name = function(arg1: byte): word;

begin end.

Более того, в pabc.net так же возможно объявлять анонимные делегаты:

begin
  var p1: procedure(arg1: byte);
  var f1: function(arg1: byte): word;
end.

Но, конечно, это объявление на то и анонимное, что даже если объявить их одинаково - типы будут разные:

begin
  var p1: procedure(arg1: byte) := a->exit();
  var p2: procedure(arg1: byte) := a->exit();
  writeln(p1.GetType = p2.GetType); // False
end.

В паскале анонимные делегаты работают, в отличии от C#, потому что тут у всех делегатов есть operator implicit для приведения к типу любого другого делегата с теми же параметрами и возвращаемым значением:

begin
  var p1: procedure(arg1: byte) := a->exit();
  var p2: procedure(arg1: byte) := a->exit();
  p2 := p1; // компилируется нормально
end.

Так же ещё есть 3 вид объявления, в формате лямбды:

begin
  var p1: byte->();         // процедура с 1 параметром
  var p2: (byte,word)->();  // процедура с 2 параметрами
  var f1: ()->byte;         // функция без параметров
end.

Но этот код заменяется на System.Func<> и System.Action<> при компиляции.