Перейти к содержанию
Fire Monkey от А до Я
  • 0

Объектная модель делегатов


SergeyIT

Вопрос

События в Object Pascal имеют следующую сигнатуру

procedure of object

Анонимные методы - reference to procedure (function)

То есть, это различные сущности.

В языке C# эти понятия тождественны, в Java AddListener принимает интерфейс типа ActionListener.

 

Что помешало разработчикам отождествить эти понятия?

Исторически унаследованная несовместимость?

Чем отличается procedure of object от reference to procedure? Это важно с точки зрения организации приложения в стиле ООП.

Спасибо большое!

Изменено пользователем SergeyIT
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

  • procedure of object - это ссылка на метод объекта. Здесь обязательно есть неявный параметр Self.
  • reference to procedure - это ссылка на процедуру. Обратите внимание, что здесь нету неявного параметра Self.
  • Анонимные методы работают из коробки только для процедур и функций (не методов). По суди анонимные методы - это лямбда функции в С++
  • Я бы хотел, чтобы анонимные методы можно было бы писать и для методов, но увы, пока такой поддержки нету. Существует способ присваивания анонимного метода методу, но он оперирует с указателями и низкоуровневым представлением типов в памяти и не рекомендуем к использованию
  • В Delphi не все объекты. А значит, не везде будут неявные параметры.

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

Ссылка на комментарий
  • 0

Спасибо, ясность есть.

 

В Delphi не все объекты. А значит, не везде будут неявные параметры.

Раз уж затронута эта особенность. Для абстрагирования и последующего приведения типов удобно иметь общего наследника (TObject). Но это дорогое и, уверен, не совсем уж нужное удовольствие. Совершенно ясно, что некоторые основные типы должны учитываться системой особенным образом, вне иерархии наследования от TObject.
Возвращаясь к задаче приведения, будет ли хорошей практикой использование обобщенного объекта вида

TSimpleObject<T> = class(TObject)
constructor Create(wrappedPrimitive : T);
property Value : T read GetValue;

для передачи всего того, что не является TObject?

Изменено пользователем SergeyIT
Ссылка на комментарий
  • 0
  • Администраторы

Все зависит от решаемых задач. 

Но если мы говорим о хранилище значений, то такой вариант хорош. 

Плюсы:

  • Строгая типизация. Мы будем обращаться и работать со значением конкретного конечно типа без дополнительных приведений

Минусы:

  • Реализация дженериков порождает отдельный тип класса для каждого параметра шаблона. Поэтому количество памяти будет задействовано больше (если есть критерий по памяти). Например, если вы хотите хранить значения 10 типов, то вы получите на выходе 10 классов.

С учетом того, что как-то так складывается, что в Delphi разработчики не особо заботятся о количестве потребляемой памяти, то этот вариант будет чаще использоваться.

 

Другой вариант, использования RTTI для хранения значения с использованием TValue.

TSimpleObject = class(TObject)
constructor Create(wrappedPrimitive : TValue);
property Value : TValue read SetValue;

Плюсы:

  • Один класс на все типы

Недостатки:

  • Требуется дополнительный код по проверки и приведению TValue к нужному типу. 
  • Снижается скорость обращения.

P.S. Был еще вариант с Variant, но я бы его назвал устаревшим, после появления TValue.

Ссылка на комментарий
  • 0
  • Администраторы

Если требуется сделать хранилище универсальных данных, то я, конечно, бы лучше взял бы за основу TValue, словарь и снабдил бы это все хелпер методами для получения данных требуемых типов.

 

И опять же все зависит от задачи. Абстрагирование вещь хорошая, но ею стоит пользоваться там, где она жизненно необходима.

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...