Пример 14.1. Классы, используемые для создания логических элементов
(defclass COMPONENT (is-a USER) (slot ID# (create-accessor write)) ) (defclass NO-OUTPUT (is-a USER) (slot number-of-outputs (access read-only) (default 0) (create-accessor read))) (defmessage-handler NO-OUTPUT compute-output ()) (defclass ONE-OUTPUT (is-a NO-OUTPUT) (slot number-of-outputs (access read-only) (default 1) (create-accessor read)) (slot output-1 (default UNDEFINED) (create-accessor write)) (slot output-1-link (default GROUND) (create-accessor write)) (slot output-1-link-pin (default 1) (create-accessor write)) ) (defmessage-handler ONE-OUTPUT put-output-1 after (?value) (send?self:output-1-link (sym-cat put-input-?self:output-1-link-pin) ?value) ) (defclass TWO-OUTPUT (is-a ONE-OUTPUT) (slot number-of-outputs (access read-only) (default 2) (create-accessor read)) (slot output-2 (default UNDEFINED) (create-accessor write)) (slot output-2-link (default GROUND) (create-accessor write)) (slot output-2-link-pin (default 1) (create-accessor write)) ) (defmessage-handler TWO-OUTPUT put-output-2 after (?value) (send?self:output-2-link (sym-cat put-input-?self:output-2-link-pin) ?value) ) (defclass NO-INPUT (is-a USER) (slot number-of-inputs (access read-only) (default 0) (create-accessor read))) (defclass ONE-INPUT (is-a NO-INPUT) (slot number-of-inputs (access read-only) (default 1) (create-accessor read)) (slot input-1 (default UNDEFINED) (visibility public) (create-accessor read-write)) (slot input-1-link (default GROUND) (create-accessor write)) (slot input-1-link-pin (default 1) (create-accessor write))) (defmessage-handler ONE-INPUT put-input-1 after (?value) (send?self compute-output) ) (defclass TWO-INPUT (is-a ONE-INPUT) (slot number-of-inputs (access read-only) (default 2) (create-accessor read)) (slot input-2 (default UNDEFINED) (visibility public) (create-accessor write)) (slot input-2-link (default GROUND) (create-accessor write)) (slot input-2-link-pin (default 1) (create-accessor write)) ) (defmessage-handler TWO-INPUT put-input-2 after (?value) (send?self compute-output) ) Класс component является абстрактным потомком класса user. Этот класс содержит единственный слот id# для идентификационного номера компонента и определяет для него акцессор записи. Класс будет являться суперклассом для всех классов логических элементов. Набор классов no-output, one-output и two-output предназначен для реализации свойств элемента без выхода, с одним выходом и двумя выходами соответственно. Каждый следующий класс наследуется от предыдущего и добавляет к нему реализацию одного логического выхода. Класс no-output имеет единственный слот number-of-outputs со значением по умолчанию 0 и доступен только для чтения. Этот слот предназначен для хранения числа выходов элемента, унаследованного от этого класса. Кроме того, класс no-output определяет обработчик compute-output, который унаследует и переопределит все логические элементы. Именно благодаря наличию этого обработчика объекты классов логических элементов смогут самостоятельно определять результат обработки полученных сигналов. Класс one-output переопределяет слот number-of-outputs и назначает ему значение по умолчанию, равное 1. Кроме того, класс определяет набор слотов, предназначенных для описания логического выхода элемента, и связи этого выхода с последующими элементами схемы. Слот output-1 предназначен для хранения значения, образующегося на выходе элемента. По умолчанию слот имеет значение undefined. Слот output-1-link содержит имя объекта, с которым связан данный выход, и по умолчанию имеет значение ground. Слот output-1-link-pin содержит номер конкретного логического входа элемента, с которым связан данный выход, и по умолчанию равен 1. Класс one-output определяет after-обработчик put-outout-1, который сразу после присвоения значения слоту output-1 передает это значение на вход элемента, связанного с данным выходом. Класс two-output тоже переопределяет слот number-of-outputs и присваивает ему значение по умолчанию, равное 2, а также добавляет набор слотов, предназначенных для описания второго логического выхода: output-2, output-2-link и output-2-link-pin и after-обработчик put-outout-2. Следует обратить внимание на тот факт, что слоты output-1, output-1-link и output-l-link-pin и обработчик put-outout-1 не переопределяются, а наследуются от класса one-output. Набор классов no-input, one-input и two-input предназначен для реализации свойств элемента без входа, с одним входом и двумя входами соответственно. Каждый следующий класс наследуется от предыдущего и добавляет к нему реализацию еще одного логического входа. Назначение слотов, описывающих логический вход элементов input-x, input-x-link, input-x-link-pin, идентично назначению слотов, использующихся в классах one-output и two-output. Кардинальное отличие классов, реализующих логику входов элемента, заключается в том, что вместо обработчика put-outout-x классы реализуют after-обработчик put-inout-x. Этот обработчик вызывает обработчик сообщения compute-output сразу после получения нового значения. После определения классов component, no-output, one-output, two-output, no-input, one-input и two-input можно приступать к созданию классов, реализующих логику отдельных элементов схемы. Начнем с простейших по своей функциональности элементов — source и led.
|