Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Понятие ссылки на метод объекта

Модульное программирования | Понятие класса | Когда начинается работа с объектом, то он размещается в памяти. | Свойства-массивы | Для классов, связанных наследованием, существует расширенная совместимость типов (совместимы по представлению в памяти). | Перекрытие элементов класса в производных классах | Информация о типе времени выполнения программы | Атрибуты доступа к элементам объектов | Механизм вызова виртуального метода | Абстрактный виртуальный метод |


Читайте также:
  1. B. Неклассическая методология
  2. C. Постнеклассическая методология
  3. Cост. Полянская И. (гиперссылки для выполнения индивидуальных проектов) Тема 1
  4. D) сохранения точных записей, определения установленных методов (способов) и сохранения безопасности на складе
  5. D.2. Методы оценки технических уязвимостей
  6. http://bither.livejournal.com/325211.html ликбез: майдан, Украина, ссылки (копии ссылок), бандеровцы и прочее. Жестко и нелицеприятно
  7. I 7 D I РЕЛИГИЯ И НАУЧНЫЕ МЕТОДЫ

 

Delphi:

Существуют процедурные типы данных для методов объектов.

 

type

TReadLineEvent = procedure(Reader: TTextReader; constLine: string) of object;

 

Переменная такого типа – указатель на метод (method pointer). Она занимает в памяти 8 байт и хранит одновременно ссылку на объект и адрес его метода.

 

type

TTextReader = class

private

FOnReadLine: TReadLineEvent;

...

public

property OnReadLine: TReadLineEvent read FOnReadLine write FOnReadLine;

end;

 

Методы объектов, объявленные по приведенному выше шаблону, становятся совместимы по типу со свойством OnReadLine.

 

Получается, что один объект может получить какие-то уведомления от другого объекта. Такой механизм называется делегированием, поскольку он позволяет передать часть работы другому объекту, например, сосредоточить в одном объекте обработку событий, возникающих в других объектах. Это избавляет программиста от необходимости порождать многочисленные классы-наследники и перекрывать в них виртуальные методы. Делегирование широко применяется в среде Delphi. Например, все компоненты делегируют обработку своих событий той форме, в которую они помещены.

 

В C# тип делегата представляет собой ссылки на методы с конкретным списком параметров и типом возвращаемого значения. С помощью делегатов методы обрабатываются как сущности, которым можно передавать параметры и которые можно присваивать переменным. Понятие делегата близко к понятию указателя на функцию, используемому в некоторых других языках. Однако делегаты, в отличие от указателей на функции, представляют собой пример объектно-ориентированного и строго типизированного подхода к программированию.

 

В следующем примере объявляется и используется тип делегата Function.

 

delegate double Function(double x);

class Multiplier
{
double factor;

public Multiplier(double factor)

{
this.factor = factor;
}

public double Multiply(double x)

{
return x * factor;
}
}

class Test
{
static double Square(double x)

{
return x * x;
}

static double[] Apply(double[] a, Function f)

{
double[] result = new double[a.Length];
for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
return result;
}

static void Main()

{
double[] a = {0.0, 0.5, 1.0};

double[] squares = Apply(a, Square);

double[] sines = Apply(a, Math.Sin);

Multiplier m = new Multiplier(2.0);
double[] doubles = Apply(a, m.Multiply);
}
}

Делегат может ссылаться как на статический метод, так и на метод экземпляра. Делегат, ссылающийся на метод экземпляра, также ссылается на конкретный объект. При вызове такого метода экземпляра с помощью делегата этот объект становится объектом this.

Делегаты также могут создаваться с помощью анонимных функций, которые представляют собой «встроенные методы», создаваемые в процессе выполнения. Анонимные функции могут видеть локальные переменные окружающих их методов. Таким образом, приведенный выше пример множителя может быть записан проще с использованием класса Multiplier:

double[] doubles = Apply(a, (double x) => x * 2.0);

Интересной и полезной особенностью делегата является то, что для него неважен тип класса или метода, на который он ссылается. Единственным требованием является наличие у метода, на который ссылается делегат, такого же числа параметров и типа возвращаемого значения.

 


Дата добавления: 2015-11-16; просмотров: 66 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Методы обработки сообщений| Понятие события

mybiblioteka.su - 2015-2024 год. (0.007 сек.)