SergeyIT Опубликовано 25 января, 2016 Поделиться Опубликовано 25 января, 2016 (изменено) События в Object Pascal имеют следующую сигнатуру procedure of object Анонимные методы - reference to procedure (function) То есть, это различные сущности. В языке C# эти понятия тождественны, в Java AddListener принимает интерфейс типа ActionListener. Что помешало разработчикам отождествить эти понятия? Исторически унаследованная несовместимость? Чем отличается procedure of object от reference to procedure? Это важно с точки зрения организации приложения в стиле ООП. Спасибо большое! Изменено 25 января, 2016 пользователем SergeyIT Равиль Зарипов (ZuBy) 1 Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 25 января, 2016 Администраторы Поделиться Опубликовано 25 января, 2016 procedure of object - это ссылка на метод объекта. Здесь обязательно есть неявный параметр Self.reference to procedure - это ссылка на процедуру. Обратите внимание, что здесь нету неявного параметра Self.Анонимные методы работают из коробки только для процедур и функций (не методов). По суди анонимные методы - это лямбда функции в С++Я бы хотел, чтобы анонимные методы можно было бы писать и для методов, но увы, пока такой поддержки нету. Существует способ присваивания анонимного метода методу, но он оперирует с указателями и низкоуровневым представлением типов в памяти и не рекомендуем к использованиюВ Delphi не все объекты. А значит, не везде будут неявные параметры. Делегаты, протоколы и листенеры хороши для осуществления взаимодействия между объектами. Но для событийной модели они не удобны с точки зрения среды IDE. Так как если вы хотите задать один обработчик из среды, то гораздо удобнее подсунуть ссылку на метод, нежели создавать объект с поддержкой интерфейса. Равиль Зарипов (ZuBy), rareMax и zairkz 3 Цитата Ссылка на комментарий
0 SergeyIT Опубликовано 25 января, 2016 Автор Поделиться Опубликовано 25 января, 2016 (изменено) Спасибо, ясность есть. В Delphi не все объекты. А значит, не везде будут неявные параметры. Раз уж затронута эта особенность. Для абстрагирования и последующего приведения типов удобно иметь общего наследника (TObject). Но это дорогое и, уверен, не совсем уж нужное удовольствие. Совершенно ясно, что некоторые основные типы должны учитываться системой особенным образом, вне иерархии наследования от TObject. Возвращаясь к задаче приведения, будет ли хорошей практикой использование обобщенного объекта вида TSimpleObject<T> = class(TObject) constructor Create(wrappedPrimitive : T); property Value : T read GetValue; для передачи всего того, что не является TObject? Изменено 25 января, 2016 пользователем SergeyIT Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 25 января, 2016 Администраторы Поделиться Опубликовано 25 января, 2016 Все зависит от решаемых задач. Но если мы говорим о хранилище значений, то такой вариант хорош. Плюсы: Строгая типизация. Мы будем обращаться и работать со значением конкретного конечно типа без дополнительных приведений Минусы: Реализация дженериков порождает отдельный тип класса для каждого параметра шаблона. Поэтому количество памяти будет задействовано больше (если есть критерий по памяти). Например, если вы хотите хранить значения 10 типов, то вы получите на выходе 10 классов. С учетом того, что как-то так складывается, что в Delphi разработчики не особо заботятся о количестве потребляемой памяти, то этот вариант будет чаще использоваться. Другой вариант, использования RTTI для хранения значения с использованием TValue. TSimpleObject = class(TObject) constructor Create(wrappedPrimitive : TValue); property Value : TValue read SetValue; Плюсы: Один класс на все типы Недостатки: Требуется дополнительный код по проверки и приведению TValue к нужному типу. Снижается скорость обращения. P.S. Был еще вариант с Variant, но я бы его назвал устаревшим, после появления TValue. zairkz и Равиль Зарипов (ZuBy) 2 Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 25 января, 2016 Администраторы Поделиться Опубликовано 25 января, 2016 Если требуется сделать хранилище универсальных данных, то я, конечно, бы лучше взял бы за основу TValue, словарь и снабдил бы это все хелпер методами для получения данных требуемых типов. И опять же все зависит от задачи. Абстрагирование вещь хорошая, но ею стоит пользоваться там, где она жизненно необходима. dnekrasov, Равиль Зарипов (ZuBy), zairkz и 1 другой 4 Цитата Ссылка на комментарий
Вопрос
SergeyIT
События в Object Pascal имеют следующую сигнатуру
procedure of object
Анонимные методы - reference to procedure (function)
То есть, это различные сущности.
В языке C# эти понятия тождественны, в Java AddListener принимает интерфейс типа ActionListener.
Что помешало разработчикам отождествить эти понятия?
Исторически унаследованная несовместимость?
Чем отличается procedure of object от reference to procedure? Это важно с точки зрения организации приложения в стиле ООП.
Спасибо большое!
Изменено пользователем SergeyITСсылка на комментарий
4 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.