BTW, знаете ли вы, что в билде 1325 появились указатели на функции? Это как-то влияет на применение треугольной связи?
MQL5: Добавлена поддержка указателей на функции для упрощения организации моделей событий.
Чтобы объявить указатель на функцию, укажите тип "указатель на функцию", например:
typedefint (*TFunc)(int,int);
Теперь TFunc - это тип, и можно объявить переменную-указатель на функцию:
TFunc func_ptr;
Переменная func_ptr может хранить адрес функции, чтобы объявить ее позже:
int sub(int x,int y) { return(x-y); }
int add(int x,int y) { return(x+y); }
int neg(int x) { return(~x); }
func_ptr=sub;
Print(func_ptr(10,5));
func_ptr=add;
Print(func_ptr(10,5));
func_ptr=neg; // error: neg is not of int (int,int) typePrint(func_ptr(10)); // error: there should be two parameters
Указатели на функции можно хранить и передавать в качестве параметров. Вы не можете получить указатель на нестатический метод класса.
Я не уверен, что использование указателей функций реализовано и в MT4. Если да, то, конечно, можно сделать и так, при условии, что такими указателями можно управлять и массивами, поскольку это возможно с указателями классов.
вероятно, это только для MT5, и из того, что я видел, это все еще не для методов, только для функций.
Так или иначе, я все еще не понимаю, как вы определяете стороннюю способность внутри базового класса, например, в контексте трендовой линии и контейнера, где находится 3-й объект.
Чего мне, похоже, не хватает в понимании модели событий в сочетании с OO и MQL5, так это правильной диспетчеризации событий. То есть, как и где решать, кто (какой класс) получит что (событие). Понятно, что верхний диспетчер, родной для языка, т.е. язык ::OnChartEvent пишется всего один раз в проекте, в классе верхнего уровня.
Тогда отсюда, какой правильный способ или способы диспетчеризации событий к различным объектам? Должен ли быть класс диспетчеризации событий? Должно ли это быть сделано просто в ::OnChartEvent на основе операторов if?
Хорошо, думаю, я понял. Существует реальная проблема смещения понятий, когда вы переходите от процедурного к oop.
Если я правильно вас понял, то вы имеете в виду способ для CTrendLine сообщить о пересечении цены наследующему объекту CTrade посредством события, без необходимости знать о существовании CTrade, верно?
Amir Yacoby: Чего мне, похоже, не хватает в понимании модели событий в сочетании с OO и MQL5, так это правильной диспетчеризации событий. То есть, как и где решать, кто (какой класс) получит что (событие). Понятно, что верхний диспетчер, родной для языка, т.е. язык ::OnChartEvent пишется всего один раз в проекте, в классе верхнего уровня.
Тогда отсюда, какой правильный способ или способы диспетчеризации событий к различным объектам? Должен ли быть класс диспетчеризации событий? Должно ли это быть сделано просто в ::OnChartEvent на основе операторов if?
Это вообще не вопрос. ООП основано на принципах природы. Земля не кормит вас, она просто предоставляет ресурсы, а вы сами решаете, если, когда и где вам что нужно.
Amir Yacoby: Хорошо, думаю, я понял. Существует реальная проблема смещения понятий, когда вы переходите от процедурного к oop.
Если я правильно вас понял, то вы имеете в виду способ для CTrendLine сообщить о пересечении цены наследующему объекту CTrade посредством события, без необходимости знать о существовании CTrade, верно?
Так что на самом деле в каждом CObject теперь есть место одному объекту, который является получателем событий, а также есть метод регистрации для слушающего объекта, чтобы подписаться как таковой, и метод отправителя события и метод обработчика события, используемые получателем.
Это здорово, напоминает мне паттерн наблюдателя, только у наблюдателя больше одного возможного получателя, а m_reciever - это массив объектов.
Вообще-то я когда-то хотел реализовать наблюдателя и из-за отсутствия интерфейсов в MQL или множественного наследования не стал. Не подумал о вашей хорошей идее, что один и тот же объект может навязывать интерфейс с обеих сторон.
Amir Yacoby: Так что на самом деле в каждом CObject теперь есть место одному объекту, который является получателем событий, а также есть метод регистрации для слушающего объекта, чтобы подписаться как таковой, и метод отправителя события и метод обработчика события, используемый получателем.
Это здорово, напоминает мне паттерн наблюдателя, только у наблюдателя больше одного возможного получателя, а m_reciever - это массив объектов.
Вообще-то я когда-то хотел реализовать наблюдателя и из-за отсутствия интерфейсов в MQL или множественного наследования не стал. Не подумал о вашей хорошей идее, что один и тот же объект может навязывать интерфейс с обеих сторон.
Просто чтобы ободрить вас, я часто использую слушателей в MQL4.
Ovo Cz: Просто чтобы ободрить вас, я много использовал слушателей в MQL4.
Спасибо, но я не чувствую воодушевления (:
Мне удалось это сделать, но не с контрактом между издателем и слушателем, то есть издатель должен был предположить, что у слушателя есть метод обработки, но ничто не заставляло его это сделать. Или мне пришлось бы наследовать все слушатели от главного объекта слушателя - но тогда, конечно, я бы потерял всякий смысл, потому что они не могут наследовать другие классы.
В любом случае, я профи в программировании, но определенно не в OO, где у меня пока нет опыта, и я не соревнуюсь ни с кем из вас, опытных oo программистов, как Doerk. Я понял, что процедурное программирование дает хорошие навыки логики и программирования, но ментальный переход очень тяжел, особенно если процедурно ориентированный человек, как я, сталкивается с миссией создания OO-фреймворка, это совершенно другое состояние ума. А фреймворк GUI-части - это самый подробный фреймворк с множеством событий, о которых нужно заботиться, я думаю, вы согласитесь, что среди фреймворков его сложнее всего создавать.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
BTW, знаете ли вы, что в билде 1325 появились указатели на функции?
Это как-то влияет на применение треугольной связи?
MQL5: Добавлена поддержка указателей на функции для упрощения организации моделей событий.
Чтобы объявить указатель на функцию, укажите тип "указатель на функцию", например:
Теперь TFunc - это тип, и можно объявить переменную-указатель на функцию:
Переменная func_ptr может хранить адрес функции, чтобы объявить ее позже:
Указатели на функции можно хранить и передавать в качестве параметров. Вы не можете получить указатель на нестатический метод класса.
вероятно, это только для MT5, и из того, что я видел, это все еще не для методов, только для функций.
Так или иначе, я все еще не понимаю, как вы определяете стороннюю способность внутри базового класса, например, в контексте трендовой линии и контейнера, где находится 3-й объект.
Но я попробую прочитать еще раз.
То есть, как и где решать, кто (какой класс) получит что (событие).
Понятно, что верхний диспетчер, родной для языка, т.е. язык ::OnChartEvent пишется всего один раз в проекте, в классе верхнего уровня.
Тогда отсюда, какой правильный способ или способы диспетчеризации событий к различным объектам?
Должен ли быть класс диспетчеризации событий? Должно ли это быть сделано просто в ::OnChartEvent на основе операторов if?
Чего мне, похоже, не хватает в понимании модели событий в сочетании с OO и MQL5, так это правильной диспетчеризации событий.
То есть, как и где решать, кто (какой класс) получит что (событие).
Понятно, что верхний диспетчер, родной для языка, т.е. язык ::OnChartEvent пишется всего один раз в проекте, в классе верхнего уровня.
Тогда отсюда, какой правильный способ или способы диспетчеризации событий к различным объектам?
Должен ли быть класс диспетчеризации событий? Должно ли это быть сделано просто в ::OnChartEvent на основе операторов if?
Хорошо, думаю, я понял. Существует реальная проблема смещения понятий, когда вы переходите от процедурного к oop.
Вообще-то я когда-то хотел реализовать наблюдателя и из-за отсутствия интерфейсов в MQL или множественного наследования не стал. Не подумал о вашей хорошей идее, что один и тот же объект может навязывать интерфейс с обеих сторон.
Так что на самом деле в каждом CObject теперь есть место одному объекту, который является получателем событий, а также есть метод регистрации для слушающего объекта, чтобы подписаться как таковой, и метод отправителя события и метод обработчика события, используемый получателем.
Вообще-то я когда-то хотел реализовать наблюдателя и из-за отсутствия интерфейсов в MQL или множественного наследования не стал. Не подумал о вашей хорошей идее, что один и тот же объект может навязывать интерфейс с обеих сторон.
Просто чтобы ободрить вас, я много использовал слушателей в MQL4.
Спасибо, но я не чувствую воодушевления (:
Мне удалось это сделать, но не с контрактом между издателем и слушателем, то есть издатель должен был предположить, что у слушателя есть метод обработки, но ничто не заставляло его это сделать.
Или мне пришлось бы наследовать все слушатели от главного объекта слушателя - но тогда, конечно, я бы потерял всякий смысл, потому что они не могут наследовать другие классы.
В любом случае, я профи в программировании, но определенно не в OO, где у меня пока нет опыта, и я не соревнуюсь ни с кем из вас, опытных oo программистов, как Doerk.
Я понял, что процедурное программирование дает хорошие навыки логики и программирования, но ментальный переход очень тяжел, особенно если процедурно ориентированный человек, как я, сталкивается с миссией создания OO-фреймворка, это совершенно другое состояние ума. А фреймворк GUI-части - это самый подробный фреймворк с множеством событий, о которых нужно заботиться, я думаю, вы согласитесь, что среди фреймворков его сложнее всего создавать.