Переместиться к: Signal
Ссылки:
A Deeper Look at Signals and Slots
Наблюдатель (шаблон проектирования)
Wikipedia
Boost Signals (Статья на русском)
Qt
signals
and slots, etc)signals
and slotsИсходный код: std/signals.d
import std.signals; int observedMessageCounter = 0; class Observer { // наш слот void watch(string msg, int value) { switch (observedMessageCounter++) { case 0: assert(msg == "установка нового значения"); assert(value == 4); break; case 1: assert(msg == "установка нового значения"); assert(value == 6); break; default: assert(0, "Неизвестное наблюдение"); } } } class Observer2 { // наш слот void watch(string msg, int value) { } } class Foo { int value() { return _value; } int value(int v) { if (v != _value) { _value = v; // вызов всех подключенных слотов с двумя параметрами emit("установка нового значения", v); } return v; } // Примешиванием к коду нам нужно преобразовать Foo в сигнал mixin Signal!(string, int); private : int _value; } Foo a = new Foo; Observer o = new Observer; auto o2 = new Observer2; auto o3 = new Observer2; auto o4 = new Observer2; auto o5 = new Observer2; a.value = 3; // не должно вызываться o.watch() a.connect(&o.watch); // o.watch - это слот a.connect(&o2.watch); a.connect(&o3.watch); a.connect(&o4.watch); a.connect(&o5.watch); a.value = 4; // должно вызваться o.watch() a.disconnect(&o.watch); // o.watch - это больше не слот a.disconnect(&o3.watch); a.disconnect(&o5.watch); a.disconnect(&o4.watch); a.disconnect(&o2.watch); a.value = 5; // не должно вызываться o.watch() a.connect(&o2.watch); a.connect(&o.watch); // снова соединение a.value = 6; // должно вызваться o.watch() destroy(o); // разрушение o должно автоматически отсоединить его a.value = 7; // не должно вызываться o.watch() assert(observedMessageCounter == 2);
slot_t
= void delegate(T1);
slot_t
— тип делегата. Делегат должен быть экземпляром класса или интерфейсом к экземпляру класса.
Члены экземпляров структур или вложенных функций нельзя использовать как слоты.emit
(T1 i
);
i
.connect
(slot_t slot
);
slot
, который будет вызываться при вызове emit().disconnect
(slot_t slot
);
slot
из списка слотов, вызываемых при вызове emit().