define
-
ИМЯ
- oo::define, oo::objdefine — определение и настройка классов и объектов
- СИНТАКСИС
- ОПИСАНИЕ
- НАСТРОЙКА КЛАССОВ
-
constructor argList bodyScript
- deletemethod name ?name ...
- destructor bodyScript
- export name ?name ...?
- filter ?-slotOperation? ?methodName ...?
- forward name cmdName ?arg ...?
- method name argList bodyScript
- mixin ?-slotOperation? ?className ...?
- renamemethod fromName toName
- self subcommand arg ...
- self script
- superclass ?-slotOperation? ?className ...?
- unexport name ?name ...?
- variable ?-slotOperation? ?name ...?
- deletemethod name ?name ...
- НАСТРОЙКА ОБЪЕКТОВ
-
class className
- deletemethod name ?name ...
- export name ?name ...?
- filter ?-slotOperation? ?methodName ...?
- forward name cmdName ?arg ...?
- method name argList bodyScript
- mixin ?-slotOperation? ?className ...?
- renamemethod fromName toName
- unexport name ?name ...?
- variable ?-slotOperation? ?name ...?
- deletemethod name ?name ...
- ОПРЕДЕЛЕНИЯ СО СЛОТАМИ
-
slot -append ?member ...?
- slot -clear
- slot -set ?member ...?
- slot -clear
- РЕАЛИЗАЦИЯ СЛОТОВ
-
slot Get
- slot Set elementList
- ПРИМЕРЫ
- СМОТРИТЕ ТАКЖЕ
- КЛЮЧЕВЫЕ СЛОВА
Имя
oo::define, oo::objdefine — определение и настройка классов и объектовСинтаксис
package require TclOOoo::define class defScript
oo::define class subcommand arg ?arg ...?
oo::objdefine object defScript
oo::objdefine object subcommand arg ?arg ...?
Описание
Команда oo::define используется для управления настройкой классов, а команда oo::objdefine — для управления настройкой объектов (включая классы как экземпляры объектов) с применением конфигурации к сущности, указанной в аргументе class или object. Настройка класса также обновляет конфигурацию всех подклассов класса и всех объектов, являющихся экземплярами этого класса или использующих его (как изменяется любой конфигурацией по экземпляру). Способ настройки контролируется либо аргументом defScript, либо аргументами subcommand и последующими аргументами arg; когда второй присутствует, это точно так же, как если бы все аргументы от subcommand далее были преобразованы в список, и этот список использовался как аргумент defScript.Настройка классов
В defScript для oo::define поддерживаются следующие команды, каждая из которых также может использоваться в форме subcommand:- конструктор argList bodyScript
- Это создаёт или обновляет конструктор класса. Формальные аргументы конструктора (определяются в том же формате, что и для команды Tcl proc) будут argList, а тело конструктора — bodyScript. При выполнении тела конструктора текущий пространство имён конструктора будет пространством имён, уникальным для создаваемого объекта. Внутри конструктора следует использовать команду next для вызова конструкторов суперклассов. Если bodyScript пустая строка, конструктор будет удалён.
- deletemethod name ?name ...
- Это удаляет каждый из методов, названных name, из класса. Методы должны были существовать в этом классе ранее. Не влияет на суперклассы класса, а также на подклассы или экземпляры класса (за исключением случаев, когда есть цепочка вызовов через изменяемый класс).
- деструктор bodyScript
- Это создаёт или обновляет деструктор для класса. Деструкторы не принимают аргументов, а телом деструктора будет bodyScript. Деструктор вызывается при удалении объектов класса и, когда вызывается, имеет уникальное пространство имён объекта в качестве текущего пространства имён. Деструкторы должны использовать команду next для вызова деструкторов суперклассов. Обратите внимание, что деструкторы не вызываются во всех ситуациях (например, если интерпретатор уничтожается). Если bodyScript пустая строка, деструктор будет удалён.
- Обратите внимание, что ошибки при выполнении деструктора не возвращаются коду, вызвавшему уничтожение объекта. Вместо этого они передаются в текущий обработчик bgerror.
- export name ?name ...?
- Это обеспечивает экспорт (т.е. доступность вне экземпляра через команду объекта экземпляра) каждого из указанных методов name классом, который определяется. Обратите внимание, что сами методы могут быть фактически определены суперклассом; экспорт подкласса переопределяет видимость суперкласса и может быть переопределён экземплярами.
- filter ?-slotOperation? ?methodName ...?
- Этот слот (см. ОПРЕДЕЛЕНИЯ СЛОТОВ ниже) устанавливает или обновляет список имён методов, используемых для защиты от вызова метода экземпляров класса и определения результатов метода. Каждый methodName называет отдельный фильтрующий метод (который может быть экспортирован или нет); ошибка не возникает для неназванного несуществующего метода, так как они могут быть определены подклассами. По умолчанию этот слот работает путем добавления.
- forward name cmdName ?arg ...?
- Это создаёт или обновляет перенаправляемый метод с именем name. Метод определяется как перенаправляемый на команду cmdName с добавлением дополнительных аргументов arg и т.д. перед аргументами, указанными вызывающей стороной метода. cmdName всегда разрешается по правилам пространства имён вызывающих объектов, т.е. если cmdName не является полностью квалифицированным, команда будет искаться в каждом пространстве имён объекта, используя путь пространства имён экземпляров или глобальное пространство имён. Метод будет экспортирован, если name начинается с маленькой буквы, и не экспортирован в противном случае.
- method name argList bodyScript
- Это создаёт или обновляет метод, реализованный как скрипт, подобный процедуре. Имя метода — name, формальные аргументы метода (определяются в том же формате, что и для команды Tcl proc) — argList, а тело метода — bodyScript. При выполнении тела метода текущее пространство имён метода будет пространством имён, уникальным для текущего объекта. Метод будет экспортирован, если name начинается с маленькой буквы, и не экспортирован в противном случае; это поведение может быть переопределено с помощью export и unexport.
- mixin ?-slotOperation? ?className ...?
- Этот слот (см. ОПРЕДЕЛЕНИЯ СЛОТОВ ниже) устанавливает или обновляет список дополнительных классов, которые должны быть смешаны во все экземпляры определяемого класса. Каждый аргумент className называет отдельный класс, который должен быть смешан. По умолчанию этот слот работает путём замены.
- renamemethod fromName toName
- Это переименовывает метод fromName в классе на toName. Метод должен был существовать в классе ранее, а toName не должен был ранее ссылаться на метод в этом классе. Не влияет на суперклассы класса, а также на подклассы или экземпляры класса (за исключением случаев, когда есть цепочка вызовов через изменяемый класс). Не меняет статус экспорта метода; если он был экспортирован ранее, он им останется.
- self subcommand arg ...
- self script
- Эта команда эквивалентна вызову oo::objdefine для определяемого класса (см. НАСТРОЙКА ОБЪЕКТОВ ниже для описания поддерживаемых значений subcommand). Она следует той же общей схеме обработки аргументов, что и команды oo::define и oo::objdefine, и «oo::define cls self subcommand ...» работает идентично «oo::objdefine cls subcommand ...».
- superclass ?-slotOperation? ?className ...?
- Этот слот (см. ОПРЕДЕЛЕНИЯ СЛОТОВ ниже) позволяет изменять суперклассы определяемого класса. Каждый аргумент className называет один класс, который должен быть суперклассом определённого класса. Обратите внимание, что объекты не должны изменяться из класса в не-класс или наоборот, что пустой родительский класс эквивалентен oo::object, и что родительские классы oo::object и oo::class не могут быть изменены. По умолчанию этот слот работает путём замены.
- unexport name ?name ...?
- Это обеспечивает, чтобы каждый из указанных методов name не экспортировался (т.е. не был доступен вне экземпляра через команду объекта экземпляра, а вместо этого доступен только через команду my, видимую в контексте каждого объекта) определяемым классом. Обратите внимание, что сами методы могут быть фактически определены суперклассом; неупомянутые экспорт подкласса переопределяют видимость суперкласса и могут быть переопределены неупомянутыми экспортами экземпляра.
- variable ?-slotOperation? ?name ...?
- Этот слот (см. ОПРЕДЕЛЕНИЯ СЛОТОВ ниже) обеспечивает, чтобы каждая из указанных переменных была автоматически доступна в методах, конструкторе и деструкторе, объявленных определяемым классом. Каждое имя переменной не должно содержать разделителей пространства имён и не должно выглядеть как доступ к массиву. Все переменные фактически будут присутствовать в объекте экземпляра, на котором выполняется метод. Обратите внимание, что списки переменных, объявленные суперклассом или подклассом, совершенно независимы, как и списки переменных, объявленные экземплярами; список имён переменных предназначен только для методов (и конструкторов и деструкторов), объявленных этим классом. По умолчанию этот слот работает путем добавления.
Настройка объектов
Следующие команды поддерживаются в defScript для oo::objdefine, каждая из которых также может использоваться в форме subcommand:- class className
- Это позволяет изменить класс объекта после его создания. Обратите внимание, что конструкторы класса не вызываются при этом, и поэтому объект может оказаться в несогласованном состоянии, если не будет выполнена дополнительная работа по настройке.
- deletemethod name ?name ...
- Это удаляет каждый из методов, названных name, из объекта. Методы должны были ранее существовать в этом объекте. Не влияет на классы, экземплярами которых является объект.
- export name ?name ...?
- Это организует экспорт (т.е. доступность снаружи объекта через команду объекта) каждого из перечисленных методов, name, для определяемого объекта. Обратите внимание, что сами методы могут быть фактически определены классом или суперклассом; экспорт объекта переопределяет видимость класса.
- filter ?-slotOperation? ?methodName ...?
- Этот слот (см. ОПРЕДЕЛЕНИЯ СЛОТОВ ниже) устанавливает или обновляет список имен методов, используемых для защиты от вызова метода объекта и определения результатов метода. Каждый methodName называет отдельный метод фильтрации (который может быть или не быть экспортированным); отсутствие метода не является ошибкой. Обратите внимание, что фактический список фильтров также зависит от фильтров, установленных для любых классов, экземплярами которых является объект. По умолчанию этот слот работает путем добавления.
- forward name cmdName ?arg ...?
- Это создает или обновляет перенаправленный метод объекта, называемый name. Метод определяется путем перенаправления на команду, называемую cmdName, с добавлением дополнительных аргументов arg и т.д. перед теми аргументами, которые указаны вызывающим методом. Перенаправленные методы должны быть удалены с помощью подкоманды method. Метод будет экспортирован, если name начинается с маленькой буквы, и не экспортирован в противном случае.
- method name argList bodyScript
- Это создает, обновляет или удаляет метод объекта. Имя метода — name, формальные аргументы метода (определенные с помощью того же формата, что и для команды Tcl proc) — argList, а тело метода — bodyScript. При оценке тела метода текущим пространством имен метода будет пространство имен, уникальное для объекта. Метод будет экспортирован, если name начинается с маленькой буквы, и не экспортирован в противном случае.
- mixin ?-slotOperation? ?className ...?
- Этот слот (см. ОПРЕДЕЛЕНИЯ СЛОТОВ ниже) устанавливает или обновляет список дополнительных классов на объект, которые должны быть смешаны в объект. Каждый аргумент className называет отдельный класс, который должен быть смешан. По умолчанию этот слот работает путем замены.
- renamemethod fromName toName
- Это переименовывает метод, называемый fromName в объекте, в toName. Метод должен был ранее существовать в объекте, а toName не должен был ранее ссылаться на метод в этом объекте. Не влияет на классы, экземплярами которых является объект. Не изменяет статус экспорта метода; если он был экспортирован ранее, он будет экспортирован и после переименования.
- unexport name ?name ...?
- Это организует отсутствие экспорта каждого из перечисленных методов, name (т.е. они недоступны снаружи объекта через команду объекта, а вместо этого доступны только через команду my, видимую в контексте объекта) определяемого объекта. Обратите внимание, что сами методы могут фактически быть определены классом; исключения из экспорта экземпляров переопределяют видимость класса.
- variable ?-slotOperation? ?name ...?
- Этот слот (см. ОПРЕДЕЛЕНИЯ СЛОТОВ ниже) организует автоматическую доступность каждой из перечисленных переменных в методах, объявленных определяемым объектом. Каждое имя переменной не должно содержать разделителей пространства имен и не должно выглядеть как доступ к массиву. Все переменные будут фактически присутствовать в объекте, над которым выполняется метод. Обратите внимание, что списки переменных, объявленные классами и смешиваниями, экземплярами которых является объект, полностью независимы; список имен переменных предназначен только для методов, объявленных этим объектом. По умолчанию этот слот работает путем добавления.
Определения слотов
Некоторые конфигурируемые определения класса или объекта являются определениями слотов. Это означает, что конфигурация реализуется объектом слота, который является экземпляром класса oo::Slot, который управляет списком значений (имен классов, имен переменных и т.д.), составляющих содержимое слота. Класс определяет три операции (как методы), которые могут быть выполнены со слотом:- slot -append ?member ...?
- Это добавляет указанные элементы member к определению слота.
- slot -clear
- Это устанавливает определение слота в пустой список.
- slot -set ?member ...?
- Это заменяет определение слота заданными элементами member.
Следствием этого является то, что любое использование операции по умолчанию слота, где первый аргумент члена начинается с дефиса, будет ошибкой. В таких случаях следует явно использовать одну из вышеуказанных операций.
Реализация слотов
Внутри объекты слотов также определяют метод --default-operation, который перенаправляется на операцию по умолчанию слота (например, для слота класса «variable» это перенаправляется на «my -append»), и эти методы, которые обеспечивают интерфейс реализации:- slot Get
- Возвращает список, который является текущим содержимым слота. Этот метод всегда должен вызываться из стековой рамки, созданной вызовом oo::define или oo::objdefine.
- slot Set elementList
- Устанавливает содержимое слота в список elementList и возвращает пустую строку. Этот метод всегда должен вызываться из стековой рамки, созданной вызовом oo::define или oo::objdefine.
Реализация этих методов зависит от слота (и отвечает за доступ к правильной части определения класса или объекта). Слоты также имеют обработчик неизвестных методов для связывания всех этих фрагментов вместе, и они скрывают свой метод destroy, чтобы его не вызывали непреднамеренно. Рекомендуется, чтобы любые пользовательские изменения в механизме слотов ограничивались определением новых операций, имена которых начинаются с дефиса.
Примеры
Этот пример демонстрирует использование обеих форм команд oo::define и oo::objdefine (они работают одинаково), а также иллюстрирует четыре подкоманды этих команд.oo::class create c
c create o
oo::define c method foo {} {
puts "world"
}
oo::objdefine o {
method bar {} {
my Foo "hello "
my foo
}
forward Foo ::puts -nonewline
unexport foo
}
o bar → prints "hello world"
o foo → error "unknown method foo"
o Foo Bar → error "unknown method Foo"
oo::objdefine o renamemethod bar lollipop
o lollipop → prints "hello world" Этот пример показывает, как дополнительные классы могут быть смешаны в объект. Он также показывает, что mixin — это слот, который поддерживает добавление:
oo::object create inst
inst m1 → error "unknown method m1"
inst m2 → error "unknown method m2"
oo::class create A {
method m1 {} {
puts "red brick"
}
}
oo::objdefine inst {
mixin A
}
inst m1 → prints "red brick"
inst m2 → error "unknown method m2"
oo::class create B {
method m2 {} {
puts "blue brick"
}
}
oo::objdefine inst {
mixin -append B
}
inst m1 → prints "red brick"
inst m2 → prints "blue brick" См. также
next, oo::class, oo::object
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/define.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/define.htm