Spec-Zone.ru › D

std.signals

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

Существуют различные реализации сигналов и слотов на D. Эта версия использует несколько новых возможностей D, что упрощает её использование и снижает вероятность ошибок. В частности, теперь нет необходимости в инструментировании слотов.

Ссылки
Более глубокий взгляд на сигналы и слоты
Паттерн наблюдатель
Википедия
Boost Signals
Qt
Про эту тему много обсуждалось на форумах D, и существуют различные реализации: библиотека сигналов и слотов
Сигналы и слоты в D
Динамическое связывание — сигналы и слоты Qt по сравнению с Objective-C
Разобрать SS
о harmonia
Другой модуль обработки событий
Предложение: механизм сигналов/слотов
Сигналы и слоты?
Сигналы и слоты готовы к оценке
Сигналы и слоты для Уолтера
Механизм сигналов/слотов?
Современные возможности?
Делегаты против интерфейсов
Значение компонентного программирования (свойства, сигналы и слоты и т. д.)
сигналы и слоты
Ошибки:
Слоты могут быть только делегатами, образованными из объектов классов или интерфейсов к объектам классов. Если в connect() передаётся делегат на что-то другое, например, на функцию члена структуры, вложенную функцию, COM-интерфейс или замыкание, результат будет неопределённым. Небезопасно для нескольких потоков, работающих с одними и теми же сигналами или слотами.
Лицензия:
Лицензия Boost 1.0.
Авторы:
Уолтер Брайт
Исходный код
std/signals.d
шаблон Signal(T1...)

Миксин для создания сигнала внутри объекта класса.

Разные сигналы могут быть добавлены в класс путем именования миксинов.

Примеры:
import std.signals;

int observedMessageCounter = 0;

class Observer
{   // our slot
    void watch(string msg, int value)
    {
        switch (observedMessageCounter++)
        {
            case 0:
                writeln(msg); // "setting new value"
                writeln(value); // 4
                break;
            case 1:
                writeln(msg); // "setting new value"
                writeln(value); // 6
                break;
            default:
                assert(0, "Unknown observation");
        }
    }
}

class Observer2
{   // our slot
    void watch(string msg, int value)
    {
    }
}

class Foo
{
    int value() { return _value; }

    int value(int v)
    {
        if (v != _value)
        {   _value = v;
            // call all the connected slots with the two parameters
            emit("setting new value", v);
        }
        return v;
    }

    // Mix in all the code we need to make Foo into a signal
    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;                // should not call o.watch()
a.connect(&o.watch);        // o.watch is the slot
a.connect(&o2.watch);
a.connect(&o3.watch);
a.connect(&o4.watch);
a.connect(&o5.watch);
a.value = 4;                // should call o.watch()
a.disconnect(&o.watch);     // o.watch is no longer a slot
a.disconnect(&o3.watch);
a.disconnect(&o5.watch);
a.disconnect(&o4.watch);
a.disconnect(&o2.watch);
a.value = 5;                // so should not call o.watch()
a.connect(&o2.watch);
a.connect(&o.watch);        // connect again
a.value = 6;                // should call o.watch()
destroy(o);                 // destroying o should automatically disconnect it
a.value = 7;                // should not call o.watch()

writeln(observedMessageCounter); // 2
alias slot_t = void delegate(T1);

Слоты реализуются как делегаты. slot_t — тип делегата. Делегат должен быть связан с экземпляром класса или интерфейсом экземпляра класса. Делегаты на экземпляры структур или вложенные функции не должны использоваться в качестве слотов.

final void emit(T1 i);

Вызов каждого из подключенных слотов, передавая им аргумент(ы) i.

Вложенные вызовы будут проигнорированы.

final void connect(slot_t slot);

Добавление слота в список слотов, которые будут вызваны при вызове emit().

final void disconnect(slot_t slot);

Удаление слота из списка слотов, которые будут вызваны при вызове emit().

final void disconnectAll();

Отключение всех слотов.

© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_signals.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API