Есть метод класса, есть метод объекта этого класса.
У объекта указано, что выполнять метод класса до выполнения метода объекта.
Если ли какая-то возможность на уровне метода класса отменить выполнение метода объекта?
Реальное применение:
Есть много выключателей (класс wallSwitch) у них есть метод объекта statusChanged в котором я прописываю действие включить/выключить. А теперь допустим я хочу чтобы они работали только с 8 до 22 - мне либо прописать проверку в методе каждого объекта или написать один раз в методе класса.
Пока писал вопрос придумал обходной путь:
- сделать разные название для методов класса и объекта
- вызывать метод класса и уже их него при прохождении проверок вызывать метод объекта.
Но все такие хотелось бы узнать ответ на изначальный вопрос.
Как отменить выполнение метода объекта в метода класса?
Модератор: immortal
-
- Сообщения: 1473
- Зарегистрирован: Сб окт 12, 2013 11:03 pm
- Благодарил (а): 49 раз
- Поблагодарили: 327 раз
Re: Как отменить выполнение метода объекта в метода класса?
Вам поможет ООП
Создайте класс наследника. В нём пропишите в нём свою обработку
Перепривязать объекты к новому классу
Создайте класс наследника. В нём пропишите в нём свою обработку
Перепривязать объекты к новому классу
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Как отменить выполнение метода объекта в метода класса?
Просто так из кода метода класса нельзя отменить выполнение кода объекта. Ещё из простых вариантов пришедших в голову, это завести какое-то свойство, которое метод класса будет устанавливать в 1 или 0, а метод объекта в самом начале проверять.
в коде метода класса пишем:
в коде метода объекта пишем
в коде метода класса пишем:
Код: Выделить всё
$this->setProperty('AllowExecution',1); //разрешить
$this->setProperty('AllowExecution',0); //запретить
Код: Выделить всё
if (!$this->getProperty('AllowExecution')) {
return;
}
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- Bagir
- Сообщения: 1613
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Как отменить выполнение метода объекта в метода класса?
Я тоже озадачился подобной задачей. $this->setProperty первое что пришло в голову, но так делать мне не хотелось. Тема была заброшена, но сейчас для меня снова стала актуальной.
В родительском методе пишем
и при каком то там условии
В начале кода объекта
Стоит понимать, что код метода объекта всё равно будет выполнен, но при этом он сразу будет завершен.
И раз уж разговор идет о связке родительского кода и кода метода объекта, то вот ещё интересная штучка:
Допустим мы управляем реле, и в родительском коде принимаем решение, что реле точно будет включено или выключено. Лично у меня на это может повлиять свойство со значениями выкл/вкл/авто, а так же существования таймера для работы или блокировки. Родительский код переключает реле и завершается с помощью return 3; Если решение не было принято родительским кодом, то в конце завершим его return 2; Теперь самое интересное, если у объекта есть свой настроенный код метода, то по завершению, если мы ничего не укажем в return, ответ будет 1. Теперь мы можем видеть, есть ли у объекта заполненный метод, или решение было принято родительским.
Пример использования:
При активности в комнате я хочу включить свет. У моих реле есть метод logic в котором я храню логику работы реле со всякими условиями. Но этот метод заполнен далеко не для всех моих реле.
Я понятия не имею, когда руки дойдут до написания логики конкретно этого реле, и нужно ли вообще это будет, но как только это случиться, RelayBhZalLight1.logic перестанет возвращать 2, и будут работать уже условия в этом объекте.
А если посмотреть ещё шире, то ответ RelayBhZalLight1.logic может быть
1 - решение о работе реле принял код метода объекта
2 - своего кода у объекта нет, родительский код не принял решение о изменении статуса реле
3 - решение принято родительским кодом, выполнение кода объекта блокировано.
В родительском методе пишем
Код: Выделить всё
global $do_not_execute_object_method;
Код: Выделить всё
$do_not_execute_object_method = true;
Код: Выделить всё
global $do_not_execute_object_method;
if ($do_not_execute_object_method) { return; }
И раз уж разговор идет о связке родительского кода и кода метода объекта, то вот ещё интересная штучка:
Допустим мы управляем реле, и в родительском коде принимаем решение, что реле точно будет включено или выключено. Лично у меня на это может повлиять свойство со значениями выкл/вкл/авто, а так же существования таймера для работы или блокировки. Родительский код переключает реле и завершается с помощью return 3; Если решение не было принято родительским кодом, то в конце завершим его return 2; Теперь самое интересное, если у объекта есть свой настроенный код метода, то по завершению, если мы ничего не укажем в return, ответ будет 1. Теперь мы можем видеть, есть ли у объекта заполненный метод, или решение было принято родительским.
Пример использования:
При активности в комнате я хочу включить свет. У моих реле есть метод logic в котором я храню логику работы реле со всякими условиями. Но этот метод заполнен далеко не для всех моих реле.
Код: Выделить всё
// Включить свет
if ((int)cm('RelayBhZalLight1.logic') == 2) {
if (!gg('RelayBhZalLight1.status')) {
callMethod('RelayBhZalLight1.turnOn');
}
}
А если посмотреть ещё шире, то ответ RelayBhZalLight1.logic может быть
1 - решение о работе реле принял код метода объекта
2 - своего кода у объекта нет, родительский код не принял решение о изменении статуса реле
3 - решение принято родительским кодом, выполнение кода объекта блокировано.