|
Делегаты
В Си Шарп делегат это нечто указателя на функцию в других языках программирования.
Делеагы выполняют туже самую функцию, но более удобно и безопасно, то есть основное назначение это обратный вызов
то есть это посылка сообщения объектам, которые их породили.
Делегат определяется так
public delegate void Play(object music, int volume);
|
так как в C Sharp все является классом то и делегат в момент компиляции превращается в класс, наследуемый от system.Multicastdelegate
Создадим класс Car в котором будет делегат и два метода
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
car c = new car("BMW");
garage gar = new garage();
gar.ProcCar(new car.CarDelegate(Run));
gar.ProcCar(new car.CarDelegate(Jump));
}
public static void Jump(car c)
{
Console.WriteLine("Jump");
}
public static void Run(car c)
{
Console.WriteLine("Run");
}
}
class garage
{
car c;
public garage()
{
c = new car("BMW");
}
public void ProcCar(car.CarDelegate proc)
{
Console.WriteLine(proc.Method.ToString());
proc(c);
}
}
class car
{
public delegate void CarDelegate(car c);
string _name;
public car(string name)
{
this._name = name;
}
}
}
|

Метод ProcCar передает управление двум статическим методам, то есть мы добавляем указатель на функцию Run во внутреннюю таблицу указателей делегата CarDelegate
Предыдущая стр.   
Оглавление   
Следующая стр.
Средняя оценка:     (1,33 - 6 голосов) Для оценки необходимо зарегистрироваться
Только зарегистрировавшиеся пользователи могут оставлять комментарии
Комментирует Silver_off 12.07.2010 15:08:12 Бля, а чого немає відкликів ((((
Комментирует Walker 13.09.2011 11:42:24 Непонятно. На фоне простоты предыдущих примеров этот и следующий выглядят странно.
Комментирует YaDima 19.11.2011 16:12:48 С точки зрения C++ это полнейший беспредел. Получается что тип "указатель на функцию" принимающюю объект типа car обьявленный в car, может присваивать "посторонюю функцию". Надо привыкнуть думать по сишарповски.
Комментирует YaDima 19.11.2011 16:21:30 И вообще странно это:
gar.ProcCar(new car.CarDelegate(Run));
Эт чо одновременно создаётся безымянный car и тут же достаётся делегат и в скобках имя чужого метода а не обьект типа car. Блин очень странно ((( мистика какая-то =)
Комментирует YaDima 19.11.2011 16:29:58 Это ж ядрить колотить, если делегат получается класс то какой-то интересный конструктор принимающий имя метода! Страшно даже подумать что такое тогда в этом языке массив указателей на функцию.
|
|