## Tcl9.0.3/Tk9.0.3 Documentation > Tcl Commands > define

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  NAME
    oo::define, oo::objdefine, oo::Slot — 級と対象を定義し構成設定する Define and configure classes and objects
  構文 SYNOPSIS
  CLASS HIERARCHY
  説明 DESCRIPTION
  の構成設定 　CONFIGURING CLASSES
    classmethod name ?argList bodyScrip?
    constructor argList bodyScript
    destructor bodyScript
    export name ?name ...?
    forward name cmdName ?arg ...?
    initialise script
    initialize script
    method name ?option? argList bodyScript
    private cmd arg...
    private script
    self subcommand arg ...
    self script
    self
    superclass ?-slotOperation? ?className ...?
    unexport name ?name ...?
    variable ?-slotOperation? ?name ...?
  高級な級の構成設定の指示項目 ADVANCED CLASS CONFIGURATION OPTIONS
    definitionnamespace ?kind? namespaceName
    deletemethod name ?name ...?
    filter ?-slotOperation? ?methodName ...?
    mixin ?-slotOperation? ?className ...?
    renamemethod fromName toName
  対象の構成設定 CONFIGURING OBJECTS
    export name ?name ...?
    forward name cmdName ?arg ...?
    method name ?option? argList bodyScript
    mixin ?-slotOperation? ?className ...?
    private cmd arg...
    private script
    unexport name ?name ...?
    variable ?-slotOperation? ?name ...?
  高級な対象の構成設定指示項目 ADVANCED OBJECT CONFIGURATION OPTIONS
    class className
    deletemethod name ?name ...
    filter ?-slotOperation? ?methodName ...?
    renamemethod fromName toName
    self
  私的手段 PRIVATE METHODS
  SLOTTED DEFINITIONS
    slot -append ?member ...?
    slot -appendifnew ?member ...?
    slot -clear
    slot -prepend ?member ...?
    slot -remove ?member ...?
    slot -set ?member ...?
  細溝の実装 SLOT IMPLEMENTATION
    slot Get
    slot Resolve slotElement
    slot Resolve element
    slot Set elementList
  用例 EXAMPLES
  SEE ALSO
  KEYWORDS

### NAME

oo::define, oo::objdefine, oo::Slot — 級と対象を定義し構成設定する Define and configure classes and objects

### 構文 SYNOPSIS

package require tcl::oo
oo::define class defScript
oo::define class subcommand arg ?arg ...?
oo::objdefine object defScript
oo::objdefine object subcommand arg ?arg ...?
oo::Slot arg...

### CLASS HIERARCHY

oo::object
→ oo::Slot

### 説明 DESCRIPTION

この oo::define 命令は級の構成設定の制御に使われ､又､ oo::objdefine 命令は対象(対象の実現値としての級を含む)の構成設定の制御に使用される､ここで､構成設定は class や object 引数内の名前の実体に適用される｡級の構成設定は又､級の全ての副級と､全ての対象であってその級の実現値かそれが混入したもの､の構成設定の更新をおこす(以前のどれかの実現値の構成設定による修正として)｡構成設定が実行される方法は、defScript 引数か､又は､副命令とそれに続く arg 引数､のどちらかによって制御される; 第2の引数が存在する場合、恰も副命令から以降の全ての引数がリストにされ､そのリストが正確に defScript の引数として使用される｡ 　　 The oo::define command is used to control the configuration of classes, and the oo::objdefine command is used to control the configuration of objects (including classes as instance objects), with the configuration being applied to the entity named in the class or the object argument. Configuring a class also updates the configuration of all subclasses of the class and all objects that are instances of that class or which mix it in (as modified by any per-instance configuration). The way in which the configuration is done is controlled by either the defScript argument or by the subcommand and following arg arguments; when the second is present, it is exactly as if all the arguments from subcommand onwards are made into a list and that list is used as the defScript argument.

註意すべきは､ oo::class の為の構成子は､それが提供される記述譜引数上では oo::define と呼ばれる｡これは一段階で級を創生し定義する便利な方法である｡ Note that the constructor for oo::class will call oo::define on the script argument that it is provided. This is a convenient way to create and define a class in one step.

### の構成設定 　CONFIGURING CLASSES

oo::define の為に defScript の中で次の命令が運営されている､それぞれ､ subcommand の形式内で使われる: The following commands are supported in the defScript for oo::define, each of which may also be used in the subcommand form:

classmethod name ?argList bodyScrip?
  これは級の手段を創生するか(もしargList と bodyScript が省略された場合は)級対象上の既存の手段を級の手段にさせる｡ name と argList と bodyScript の引数は下の method の定義内に従う｡ This creates a class method, or (if argList and bodyScript are omitted) promotes an existing method on the class object to be a class method. The name, argList and bodyScript arguments are as in the method definition, below.

  級の手段は級そのものの上からも､その級の実現値の上からも呼出可能である｡現在の級は( sel と my 命令を参照のこと)､それが呼ばれた時に､それぞれ､級の上から呼ばれたか､又は､級の実現値の上から呼ばれたかによって､呼ばれた級上にあるか､呼ばれた実現値の級上にあるかになる｡もし副級上から､或は副級の実現値から呼ばれると､現在の対象は副級になる｡ Class methods can be called on either the class itself or on the instances of that class. When they are called, the current object (see the sel and my commands) is the class on which they are called or the class of the instance on which they are called, depending on whether they are called on the class or an instance of the class, respectively. If called on a subclass or instance of the subclass, the current object is the subclass.

  私的定義の文脈内で､級として起動された手段は私的ではないが､級の実現値上で起動された手段は私的である｡ In a private definition context, the methods as invoked on classes are not private, but the methods as invoked on instances of classes are private.

constructor argList bodyScript
  これは級の為の構成子を生成するか更新する｡構成子( Tcl の proc 命令と同じ形式を使って定義される)に対する公式の引数はargList であり､構成子の本体は bodyScript である｡構成子の本体が評価される時､現在の構成子の名前空間は構成されている対象に対して唯一の名前空間である｡構成子の内部では､ next 命令は上位の級の構成子を呼出すために使われる｡もし､bodyScript が空文字列であると､構成子は削除される｡ This creates or updates the constructor for a class. The formal arguments to the constructor (defined using the same format as for the Tcl proc command) will be argList, and the body of the constructor will be bodyScript. When the body of the constructor is evaluated, the current namespace of the constructor will be a namespace that is unique to the object being constructed. Within the constructor, the next command should be used to call the superclasses' constructors. If bodyScript is the empty string, the constructor will be deleted.

  構成子を定義させるためには級は必要ではない｡もし何も指定されない場合､代りに上の級の構成子が使われる｡ Classes do not need to have a constructor defined. If none is specified, the superclass's constructor will be used instead.

destructor bodyScript
  これは級のための消去函数を作成または更新する｡消去函数は引数をとらず､消去函数の本体は bodyScript になる｡消去函数は級の対象が消去される時に呼出され､呼出される時に､現在の名前空間として対象の唯一の名前空間を有する｡消去函数は上位の級の消去函数を呼出す為には next 命令を使うべきである｡註意すべきは､消去函数は全ての状況で呼出されるわけではない(譬えば､もし解釈実行機能が破壊される場合)｡もし bodyScript が空文字列の場合､消去函数は削除される｡ This creates or updates the destructor for a class. Destructors take no arguments, and the body of the destructor will be bodyScript. The destructor is called when objects of the class are deleted, and when called will have the object's unique namespace as the current namespace. Destructors should use the next command to call the superclasses' destructors. Note that destructors are not called in all situations (e.g. if the interpreter is destroyed). If bodyScript is the empty string, the destructor will be deleted.
    註意すべきは消去函を評価中の不都合は､対象の消去の原因になった符号命令には返されない｡代りに､現在-定義されている bgerror 操作子に渡される｡ Note that errors during the evaluation of a destructor are not returned to the code that causes the destruction of an object. Instead, they are passed to the currently-defined bgerror handler.

export name ?name ...?
  これは､それぞれの name と名付られた手段に就いて､移送される様に(即ち､実現値の対象の命令により､実現値の外で使用できる)､定義された級によって手配する｡註意すべきはその手段自身は実際上位級により定義されるかもしれず; 子供の級は上書きした上位級を可視に移送し､順番に実現値に上書きされるかもしれない｡ This arranges for each of the named methods, name, to be exported (i.e. usable outside an instance through the instance object's command) by the class being defined. Note that the methods themselves may be actually defined by a superclass; subclass exports override superclass visibility, and may in turn be overridden by instances.

forward name cmdName ?arg ...?
  これは name と呼ばれる転送される手段を作成又は更新する｡その手段は､手段の呼出し者によって指定された引数より前に追加された追加引数 arg 等を伴って､ cmdName と呼ばれる命令に転送されると定義される｡cmdName は常に対象の名前空間を起動する規則を使って決定されることになる､即ち､cmdName が完全修飾されてない時､命令はそれぞれの対象の名前空間内で､即値の名前空間の経路を使うか､大域名前空間内で捜索することにより､捜索されることになる｡手段は､もし name が小文字で始まり､且つ他の手段で移送されてないと､移送されることになる｡ 　　 This creates or updates a forwarded method called name. The method is defined be forwarded to the command called cmdName, with additional arguments, arg etc., added before those arguments specified by the caller of the method. The cmdName will always be resolved using the rules of the invoking objects' namespaces, i.e., when cmdName is not fully-qualified, the command will be searched for in each object's namespace, using the instances' namespace's path, or by looking in the global namespace. The method will be exported if name starts with a lower-case letter, and non-exported otherwise.

  私的定義文脈の中の場合(下の private definition 命令参照)､この命令は私的転送手段を創生する｡ If in a private definition context (see the private definition command, below), this command creates private forwarded methods.

initialise script

initialize script
  これは局所変数を運営する文脈内で記述譜を評価し､そこでは､現在の名前空間は級対象そのものの名前空間の実現値である｡これは､譬えば級-有効範囲の変数の設定には便利である｡ This evaluates script in a context which supports local variables and where the current namespace is the instance namespace of the class object itself. This is useful for setting up, e.g., class-scoped variables.

method name ?option? argList bodyScript
  これは手続函数に似た記述譜として実装された手段を作成又は更新する｡手段の名前は name であり､手段への形式上の引数は( Tcl proc 命令の為と同じ形式を使用して定義される) argList になり､手段の本体は bodyScript になる｡手段の本体が評価された時､手段の現在の名前空間は現在の対象に対して唯一の名前空間になる｡手段は､もし name が小文字で始まり､且つ他の手段で移送されてないと､移送されることになる; この振舞いは export と unexport 若しくは､任意の媒介変数指定項目の -export か -private か -unexport を指定する事で経由で上書きされ得る｡ 　　 This creates or updates a method that is implemented as a procedure-like script. The name of the method is name, the formal arguments to the method (defined using the same format as for the Tcl proc command) will be argList, and the body of the method will be bodyScript. When the body of the method is evaluated, the current namespace of the method will be a namespace that is unique to the current object. The method will be exported if name starts with a lower-case letter, and non-exported otherwise; this behavior can be overridden via export and unexport or by specifying -export, -private or -unexport in the optional parameter option.

  もし､私的定義文脈の中の場合(下の private definition 命令参照)､若しくは､指示項目に関して -private 旗徴が与えらえている場合､この命令は私的な疑似-手続き函数の手段を創生する｡ If in a private definition context (see the private definition command, below) or if the -private flag is given for option, this command creates private procedure-like methods.

private cmd arg...

private script
  これは､現在の級の上に作られた定義が私的定義になる文脈内で記述譜(又は､命令のリスト及び cmd と args によって与えられた引数)を評価する｡ This evaluates the script (or the list of command and arguments given by cmd and args) in a context where the definitions made on the current class will be private definitions.

  以下の級定義は private によって影響を受ける: forward と method と self と variable ｡ private の中への private の入れ子は累積効果はない; 最も内側の定義文脈が私的定義文脈である｡他の全ての定義命令は振舞の上で私的定義文脈内に使われる時と差異はない｡ The following class definition commands are affected by private: forward, method, self, and variable. Nesting private inside private has no cumulative effect; the innermost definition context is just a private definition context. All other definition commands have no difference in behavior when used in a private definition context.

self subcommand arg ...

self script

self
  この命令は定義されている級上の oo::objdefine 呼出しと等価である(副命令の運営している値の記述に就いては下の CONFIGURING OBJECTS 参照)｡それは､ oo::define と oo::objdefine 命令として処理される引数の同じ一般的な紋様に続く､そして “oo::define cls self subcommand ...” は “oo::objdefine cls subcommand ...” と同じとして処理される｡ 　　　　　 This command is equivalent to calling oo::objdefine on the class being defined (see CONFIGURING OBJECTS below for a description of the supported values of subcommand). It follows the same general pattern of argument handling as the oo::define and oo::objdefine commands, and “oo::define cls self subcommand ...” operates identically to “oo::objdefine cls subcommand ...”.

  もし､引数が全く使用されないと､これは現在構成設定されている級の名前を与える｡もし､私的定義文脈内の場合(下のprivate definition 参照)､級対象上の定義は又､私的定義文脈内に作られる｡ If no arguments at all are used, this gives the name of the class currently being configured. If in a private definition context (see the private definition command, below), the definitions on the class object will also be made in a private definition context.

superclass ?-slotOperation? ?className ...?
  この細溝は(下の SLOTTED DEFINITIONS 参照)､定義されてしている級の上位級の交替を許容する｡それぞれの className 引数は定義された級の上位の級になるべき級に名前を付ける｡註意すべきは､対象は級のものから非級のものに､又はその逆向きに変化されてはならない､即ち空の親の級は oo::object に等価であり､ oo::object と oo::class の親の級は修正されてはならない｡無為設定ではこの細溝は置換されて働く｡　　　　　　 This slot (see SLOTTED DEFINITIONS below) allows the alteration of the superclasses of the class being defined. Each className argument names one class that is to be a superclass of the defined class. Note that objects must not be changed from being classes to being non-classes or vice-versa, that an empty parent class is equivalent to oo::object, and that the parent classes of oo::object and oo::class may not be modified. By default, this slot works by replacement.

unexport name ?name ...?
  これは､それぞれの name と名付られた手段に就いて､移送されない様に(即ち､実現値の対象の命令を通して､実現値の外で使用できないが､代りに丁度 my 命令を通して夫々の対象の文脈内で可視である)､定義された級によって手配する｡註意すべきはその手段自身は実際上位級により定義されるかもしれず; 子供の級は上書きした上位級を可視に移送せず､又､非輸送実現値に上書きされるかもしれない｡ 　　　 This arranges for each of the named methods, name, to be not exported (i.e. not usable outside the instance through the instance object's command, but instead just through the my command visible in each object's context) by the class being defined. Note that the methods themselves may be actually defined by a superclass; subclass unexports override superclass visibility, and may be overridden by instance unexports.

variable ?-slotOperation? ?name ...?
  この細溝は(下の SLOTTED DEFINITIONS 参照)､定義されている級によって宣言された手段と構成譜と解体譜内で､夫々の名前の付けられた変数が､自動的に利用できるように､手配する｡夫々の変数名はどのような名前空間の仕切りも有してはならず､どの配列の利用にも似ていてはならない｡全ての変数は､その上で手段が実行されている実現値の名前空間内に実際､存在することになる｡註意すべきは､上位級や子供の級によって宣言された変数リストは､実現値によって宣言された変数リストのようにばらばらにされる; 変数の名前のリストは丁度この級によって宣言された手段(及び構成譜と解体譜)に関するものである｡この細溝は置換えによって働く｡ 　　　 This slot (see SLOTTED DEFINITIONS below) arranges for each of the named variables to be automatically made available in the methods, constructor and destructor declared by the class being defined. Each variable name must not have any namespace separators and must not look like an array access. All variables will be actually present in the namespace of the instance object on which the method is executed. Note that the variable lists declared by a superclass or subclass are completely disjoint, as are variable lists declared by instances; the list of variable names is just for methods (and constructors and destructors) declared by this class. By default, this slot works by appending.

  もし､私的定義文脈内の場合 (下の private definition 命令参照)､この細溝は､この級に束縛している私的変数のリストを操作する｡私的変数束縛内で､対象の即値の内部の変数の名前は定義内で与えられる名前と異なっている; 定義内で使われる名前はこの級の手段の内部で使用者が変数を利用する名前であり､即値の名前空間内の変数の名前は､全く似ていない他の級から偶然使われることをさせる､唯一無二の前置辞を有する｡ If in a private definition context (see the private definition command, below), this slot manipulates the list of private variable bindings for this class. In a private variable binding, the name of the variable within the instance object is different to the name given in the definition; the name used in the definition is the name that you use to access the variable within the methods of this class, and the name of the variable in the instance namespace has a unique prefix that makes accidental use from other classes extremely unlikely.

#### 高級な級の構成設定の指示項目 ADVANCED CLASS CONFIGURATION OPTIONS

次の定義も運営されているが､簡単な算譜では要求されない｡ The following definitions are also supported, but are not required in simple programs:

definitionnamespace ?kind? namespaceName
  これは､それらが使う定義命令を調べる為に oo::define と oo::objdefine 命令によって何の名前空間が使われることになるかの支配を許容する｡何かの対象がそれに定義操作を適用する時､実現値になった級(及びその上位の級と混合体)はどの定義名前空間を使うべきかの助言を求められる｡oo::define は級定義名前空間を得る､又､ ::oo::objdefine は定義名前空間実現値を得る､しかし両方はそれ以外は同一の調査操作を使う｡ This allows control over what namespace will be used by the oo::define and oo::objdefine commands to look up the definition commands they use. When any object has a definition operation applied to it, the class that it is an instance of (and its superclasses and mixins) is consulted for what definition namespace to use. oo::define gets the class definition namespace, and ::oo::objdefine gets the instance definition namespace, but both otherwise use the identical lookup operation.

  これは､現在の級によって提供される種類 kind の名前空間の定義を namespaceName に設定する｡namespaceName は既存の名前空間を参照するか(級に､この様な名前空間の接続させることを停止する為に)空文字列でなければならない｡kind が供給される時は､ -class (無為設定)又は､ -instance でなければならず､それぞれ設定される oo::define か oo::objdefine を使う為の名前空間が孰れであるかを指定する｡ This sets the definition namespace of kind kind provided by the current class to namespaceName. The namespaceName must refer to a currently existing namespace, or must be the empty string (to stop the current class from having such a namespace connected). The kind, if supplied, must be either -class (the default) or -instance to specify the whether the namespace for use with oo::define or oo::objdefine respectively is being set.

  級 oo::object は ::oo::objdefine に固縛されている名前空間の実現値を有する､又､級 oo::class は ::oo::define に固縛されている名前空間を有する｡この結果､級にとってのこの性質の効果的使用は､汎級の定義を要求することである｡ The class oo::object has its instance namespace locked to ::oo::objdefine, and the class oo::class has its class namespace locked to ::oo::define. A consequence of this is that effective use of this feature for classes requires the definition of a metaclass.

deletemethod name ?name ...?
  これは級からそれぞれの name と呼ばれる手段を削除する｡その手段は以前からその級内に実在していなければならない｡級の上級に影響を及ぼしてはならないし､子供の級にも､級の実現値にも(但し､修正されている級を通す呼出連鎖を有する時を除く)､級の対象そのものにも､影響を及ぼしてはならない｡ This deletes each of the methods called name from a class. The methods must have previously existed in that class. Does not affect the superclasses of the class, nor does it affect the subclasses or instances of the class (except when they have a call chain through the class being modified) or the class object itself.

filter ?-slotOperation? ?methodName ...?
  この細溝は(下の SLOTTED DEFINITIONS 参照)､手段の名前のリストを設定又は作成する､それは､級の即値を呼出す手段が呼ばれても好いか､又､手段の結果が何であるかの監視に使われる｡夫々の methodName は一つの篩の手段(顕在化されていても隠蔽されていても)を命名する; 実在しない手段が名前付けされることは不都合ではない､理由はそれらは子供の級によって定義されるかもしれないので｡無為設定ではこの細溝は追記によって働く｡ 　　 This slot (see SLOTTED DEFINITIONS below) sets or updates the list of method names that are used to guard whether method call to instances of the class may be called and what the method's results are. Each methodName names a single filtering method (which may be exposed or not exposed); it is not an error for a non-existent method to be named since they may be defined by subclasses. By default, this slot works by appending.

mixin ?-slotOperation? ?className ...?
  この細溝は(下の SLOTTED DEFINITIONS 参照)､定義されている級の全ての即値に混入される追加の級のリストを設定するか更新する｡夫々の className 引数は､そこに混入される一つの級に名前を付ける｡無為設定では､この細溝は置換えによって働く｡ This slot (see SLOTTED DEFINITIONS below) sets or updates the list of additional classes that are to be mixed into all the instances of the class being defined. Each className argument names a single class that is to be mixed in. By default, this slot works by replacement.

renamemethod fromName toName
  これは級内の fromName と呼ばれる手段を toName に名前変更する｡手段は以前に級内に実在し､ toName は以前その級内の手段を参照していなければならない｡級の上位級に効果を及ぼさないし､子供の級や級の実現値(但し修正された級を通した呼出し連鎖を有する場合は除く)や級対象そのものにも効果を及ぼさない｡手段の輸送状態を変更しない; もし前に移送されていた場合､後回しになる｡ This renames the method called fromName in a class to toName. The method must have previously existed in the class, and toName must not previously refer to a method in that class. Does not affect the superclasses of the class, nor does it affect the subclasses or instances of the class (except when they have a call chain through the class being modified), or the class object itself. Does not change the export status of the method; if it was exported before, it will be afterwards.

### 対象の構成設定 CONFIGURING OBJECTS

oo::objdefine の為に defScript の中で次の命令が運営されている､それぞれ､ subcommand の形式内で使われる: The following commands are supported in the defScript for oo::objdefine, each of which may also be used in the subcommand form:

export name ?name ...?
  これは name と名付られたそれぞれの手段が､定義されている対象によって輸送される様に(即ち､対象の命令を通して､対象の外側で利用可能に)手配する｡註意すべきは､手段自身は､級又は上位の級により実際は定義されるかもしれない; 対象の移出は級の可視を上書きする｡ 　　　 This arranges for each of the named methods, name, to be exported (i.e. usable outside the object through the object's command) by the object being defined. Note that the methods themselves may be actually defined by a class or superclass; object exports override class visibility.

forward name cmdName ?arg ...?
  これは name と呼ばれる転送される対象手段を作成又は更新する｡その手段は､手段の呼出し者によって指定された引数より前に追加された追加引数 arg 等を伴って､ cmdName と呼ばれる命令に転送されると定義される｡転送される手段は method 副命令を使って削除すべきである｡手段は､もし name が小文字で始まり､且つ他の手段で移送されてないと､移送されることになる｡ This creates or updates a forwarded object method called name. The method is defined be forwarded to the command called cmdName, with additional arguments, arg etc., added before those arguments specified by the caller of the method. Forwarded methods should be deleted using the method subcommand. The method will be exported if name starts with a lower-case letter, and non-exported otherwise.

  もし私的定義文脈内の場合(下の private definition 命令参照)､この命令は､私的転送手段を創生する｡ If in a private definition context (see the private definition command, below), this command creates private forwarded methods.

method name ?option? argList bodyScript
  これは対象手段を作成又は削除する｡手段の名前は name であり､手段への形式上の引数は( Tcl proc 命令の為と同じ形式を使用して定義される) argList になり､手段の本体は bodyScript になる｡手段の本体が評価された時､手段の現在の名前空間は対象に対して唯一の名前空間になる｡手段は､もし name が小文字で始まり､且つ他の手段で移送されてないと､移送されることになる; これは､任意指定の指示項目 -export か -private か -unexport を指示するか､輸送と非輸送の定義経由で上書きすることができる｡ This creates, updates or deletes an object method. The name of the method is name, the formal arguments to the method (defined using the same format as for the Tcl proc command) will be argList, and the body of the method will be bodyScript. When the body of the method is evaluated, the current namespace of the method will be a namespace that is unique to the object. The method will be exported if name starts with a lower-case letter, and non-exported otherwise; this can be overridden by specifying -export, -private or -unexport in the optional parameter option, or via the export and unexport definitions.

  もし私的定義文脈内か(下の private definition 命令参照)､指示項目為に -private 旗徴が与えられている場合､この命令は､私的な 疑似-手続き函数手段を創生する｡ If in a private definition context (see the private definition command, below) or if the -private flag is given for option, this command creates private procedure-like methods.

mixin ?-slotOperation? ?className ...?
  この細溝は(下の SLOTTED DEFINITIONS 参照)､対象に混入される追加的級の前の対象のリストを設定するか更新する｡夫々の引数 className は､混入される一つの級に名前を付ける｡無為設定では､この細溝は置換えによって働く｡　　　 This slot (see SLOTTED DEFINITIONS below) sets or updates a per-object list of additional classes that are to be mixed into the object. Each argument, className, names a single class that is to be mixed in. By default, this slot works by replacement.

private cmd arg...

private script
  これは､現在の対象上になされた定義が私的定義になる文脈の中で記述譜(若しくは命令のリスト及び cmd と argsによって与えられる引数)を評価する｡ This evaluates the script (or the list of command and arguments given by cmd and args) in a context where the definitions made on the current object will be private definitions.

  以下の級定義は private によって影響を受ける: forward と method と self と variable ｡ private の中への private の入れ子は累積効果はない; 最も内側の定義文脈が私的定義文脈である｡他の全ての定義命令は振舞の上で私的定義文脈内に使われる時と差異はない｡ The following class definition commands are affected by private: forward, method, and variable. Nesting private inside private has no cumulative effect; the innermost definition context is just a private definition context. All other definition commands have no difference in behavior when used in a private definition context.

unexport name ?name ...?
  これは､それぞれの name と名付られた手段に就いて､移送されない様に(即ち､対象の命令を通して､対象の外で使用できないが､代りに､丁度 my 命令を通して対象の文脈内で可視である)､定義された対象によって手配する｡註意すべきはその手段自身は実際､級により定義されるかもしれず; 即値は級を可視に上書きすることを輸送しない｡ This arranges for each of the named methods, name, to be not exported (i.e. not usable outside the object through the object's command, but instead just through the my command visible in the object's context) by the object being defined. Note that the methods themselves may be actually defined by a class; instance unexports override class visibility.

variable ?-slotOperation? ?name ...?
  この細溝は(下の SLOTTED DEFINITIONS 参照)､夫々の名前付けられた変数が自動的に､定義されている対象によって宣言された手段内で利用可能になる様に手配する｡夫々の変数名はどの名前空間の仕切りも有してはならず､且つ､配列の利用に似ていてはならない｡全ての変数は実際､その上で手段が実行されている名前空間内に実際に存在することになる｡註意すべきは､級及びその対象が実現値の混入によって宣言された変数リストは､完全にばらばらにされる; 変数の名前のリストは丁度この対象によって宣言された手段の為である｡無為設定ではこの細溝は置換えによって働く｡ This slot (see SLOTTED DEFINITIONS below) arranges for each of the named variables to be automatically made available in the methods declared by the object being defined. Each variable name must not have any namespace separators and must not look like an array access. All variables will be actually present in the namespace of the object on which the method is executed. Note that the variable lists declared by the classes and mixins of which the object is an instance are completely disjoint; the list of variable names is just for methods declared by this object. By default, this slot works by appending.

  もし､私的定義文脈内の場合 (下の private definition 命令参照)､この細溝は､この級に束縛している私的変数のリストを操作する｡私的変数束縛内で､対象の即値の内部の変数の名前は定義内で与えられる名前と異なっている; 定義内で使われる名前は､この対象実現値の手段の内部で変数を利用する為に使う名前であり､即値の名前空間内の変数の名前は､全く似ていない他の級から偶然使われることをさせる､唯一無二の前置辞を有する｡ If in a private definition context (see the private definition command, below), this slot manipulates the list of private variable bindings for this object. In a private variable binding, the name of the variable within the instance object is different to the name given in the definition; the name used in the definition is the name that you use to access the variable within the methods of this instance object, and the name of the variable in the instance namespace has a unique prefix that makes accidental use from superclass methods extremely unlikely.

#### 高級な対象の構成設定指示項目 ADVANCED OBJECT CONFIGURATION OPTIONS

次の定義も運営されているが､簡単な算譜では要求されない｡ The following definitions are also supported, but are not required in simple programs:

class className
  これは､対象の級が生成された後に変更される事を許容する｡註意すべきは､これが実行された時には級の構成譜が呼ばれないので､追加的構成設定の作業が済む迄､対象は矛盾した状態であるかもしれない｡ This allows the class of an object to be changed after creation. Note that the class's constructors are not called when this is done, and so the object may well be in an inconsistent state unless additional configuration work is done.

deletemethod name ?name ...
  これは対象からそれぞれの name と呼ばれる手段を削除する｡その手段は以前からその対象内に実在していなければならない(譬えば､それが oo::objdefine method を通して生成されていたから)｡対象がその即値である級に影響を与えない､或は､その級の即値内に級として提供された手段の組み入れを削除する｡　　 This deletes each of the methods called name from an object. The methods must have previously existed in that object (e.g., because it was created through oo::objdefine method). Does not affect the classes that the object is an instance of, or remove the exposure of those class-provided methods in the instance of that class.

filter ?-slotOperation? ?methodName ...?
  この細溝は(下の SLOTTED DEFINITIONS 参照)､手段の名前のリストを設定又は作成する､それは､対象を呼出す手段が呼ばれても好いか､又､手段の結果が何であるかの監視に使われる｡夫々の methodName は一つの篩の手段(顕在化されていても隠蔽されていても)を命名する; 実在しない手段が名前付けされることは不都合ではない｡注意すべきは､櫛の実際のリストは､又､対象が即値である様なあらゆる級に設定された櫛に依存する｡無為設定ではこの細溝は追記によって働く｡ 　　 This slot (see SLOTTED DEFINITIONS below) sets or updates the list of method names that are used to guard whether a method call to the object may be called and what the method's results are. Each methodName names a single filtering method (which may be exposed or not exposed); it is not an error for a non-existent method to be named. Note that the actual list of filters also depends on the filters set upon any classes that the object is an instance of. By default, this slot works by appending.

renamemethod fromName toName
  これは級内の fromName と呼ばれる手段を toName に名前変更する｡ 手段は予め級内に実在しなければならず､且つ､ toName は以前にその級内の手段を参照していてはならない｡ 対象が即値のものである様な級に効果を及ぼさないし､対象即値内のそのような級に提供された手段を名前変更できない(縦え､oo::objdefine forward された手段が等価の能力を提供できても)｡ 手段の輸送状態を変更しない; もし前に移送されていた場合､後回しになる｡ This renames the method called fromName in an object to toName. The method must have previously existed in the object, and toName must not previously refer to a method in that object. Does not affect the classes that the object is an instance of and cannot rename in an instance object the methods provided by those classes (though a oo::objdefine forwarded method may provide an equivalent capability). Does not change the export status of the method; if it was exported before, it will be afterwards.

self
  これは現在構成設定されている対象の名前を与える｡ This gives the name of the object currently being configured.

### 私的手段 PRIVATE METHODS

級若しくは実現値が私的手段を有する時､その私的手段はその級か実現値の内部からのみ起動できる｡対象の手段の他の呼出者は私的手段を起動できず､恰も私的手段が実在しないかの如きである｡但し､そのような手段が他の実現値対象に使用されている時は､級の私的手段が､級の手段から起動できる; それは､級が､他の級が(特に副級や上位の級が)影響して干渉することなく､幾つかのそのものの実現値の間の振舞いを調和することに使うことができることを意味する｡私的手段は､級呼出順序の中の(self callによる報告のとおりの)全ての混合された級に､先行する｡ When a class or instance has a private method, that private method can only be invoked from within methods of that class or instance. Other callers of the object's methods cannot invoke private methods, it is as if the private methods do not exist. However, a private method of a class can be invoked from the class's methods when those methods are being used on another instance object; this means that a class can use them to coordinate behaviour between several instances of itself without interfering with how other classes (especially either subclasses or superclasses) interact. Private methods precede all mixed in classes in the method call order (as reported by self call).

### SLOTTED DEFINITIONS

幾つかの級や対象の構成設定可能な定義は細溝の定義である｡この意味は､構成設定は細溝の対象によって実装されている､即ち､それは級 oo::Slot の実現値であり､それは細溝の内容から構成される､値(級の名前､変数の名前等)のリストを管理する｡ Some of the configurable definitions of a class or object are slotted definitions. This means that the configuration is implemented by a slot object, that is an instance of the class oo::Slot, which manages a list of values (class names, variable names, etc.) that comprises the contents of the slot.

Boo::Slot 級は六つの操作を(手段として)定義し､それは細溝の上でなされ得る: The oo::Slot class defines six operations (as methods) that may be done on the slot:

slot -append ?member ...?
  これは与えられた構成員要素を細溝の定義に追加する｡ This appends the given member elements to the slot definition.

slot -appendifnew ?member ...?
  それが未だ実在しない場合､これは与えられた構成員要素を細溝の定義に追加する｡ This appends the given member elements to the slot definition if they do not already exist.

slot -clear
  これは細溝の定義を空リストに設定する｡ This sets the slot definition to the empty list.

slot -prepend ?member ...?
  これは､細溝定義に与えられた要員要素を前置する｡ This prepends the given member elements to the slot definition.

slot -remove ?member ...?
  これは細溝定義から与えられた要員要素を取去る｡ This removes the given member elements from the slot definition.

slot -set ?member ...?
  これは細溝の定義を与えられた構成員要素で置換える｡ This replaces the slot definition with the given member elements.

最初の構成員引数が横棒文字(ハイフン)で始まっている､細溝の無為設定のどのような使い方の並びも不都合になる｡このような環境下で､上述の操作の内の一つが明示的に使われるべきである｡ 　　　 A consequence of this is that any use of a slot's default operation where the first member argument begins with a hyphen will be an error. One of the above operations should be used explicitly in those circumstances.

もし､標準細溝と似た振舞の自己の細溝を定義する者があれば､その者のみoo::Slotの即値を作成する必要がある｡ You only need to make an instance of oo::Slot if you are definining your own slot that behaves like a standard slot.

#### 細溝の実装 SLOT IMPLEMENTATION

内部的に､細溝の対象は手段 --default-operation をも定義する､その手段は､細溝の無為設定の操作に転送される(そこで､級 “variable” 細溝に､これは “my-append” に転送された)､更に､実装の対話機能を提供するこれ等の手段にも: 　　　 Internally, slot objects also define a method --default-operation which is forwarded to the default operation of the slot (thus, for the class “variable” slot, this is forwarded to “my -append”), and these methods which provide the implementation interface:

slot Get
  細溝の現在の内容であるリストを返すが､細溝を修正はしない｡この手段は常に oo::define か oo::objdefine への呼出によって創生された棚枠から呼出されなければならない｡この手段は､定義文脈の外から呼ばれるか､誤った個数の引数を伴っているのでない限り不都合を返さないことになる｡ Returns a list that is the current contents of the slot, but does not modify the slot. This method must always be called from a stack frame created by a call to oo::define or oo::objdefine. This method should not return an error unless it is called from outside a definition context or with the wrong number of arguments.

  リストの要素は､もし細溝に対して意味の多い概念である場合は､完全に解析されていることが望ましい｡ The elements of the list should be fully resolved, if that is a meaningful concept to the slot.

slot Resolve slotElement
  slotElement に解析操作を適用して添付して一緒に返すが､細溝を修正はしない｡単純文字列の細溝には､何もしない操作である､一方､級の細溝については､これは級の名前をその完全修飾された級名称に対応付けする｡この手段は常に oo::define か oo::objdefine への呼出によって創生された棚枠から呼出されなければならない｡この手段は 定義文脈の外から呼ばれるか､誤った個数の引数を伴っているのでない限り不都合を返さないことになる; 解析できない引数はそのまま返される(動く為に変数が解析可能であることを全ての細溝が厳密に要求している訳ではないので)｡　　　　　　　 Returns slotElement with a resolution operation applied to it, but does not modify the slot. For slots of simple strings, this is an operation that does nothing, whereas for slots of classes, this maps a class name to its fully-qualified class name. This method must always be called from a stack frame created by a call to oo::define or oo::objdefine. This method should not return an error unless it is called from outside a definition context or with the wrong number of arguments; unresolvable arguments should be returned as is (as not all slot operations strictly require that values are resolvable to work).

  この手段の実装では､唯一無二であることや序列遵守の制限を課すべきではない､それは Set 手段の責務である｡ Implementations should not enforce uniqueness and ordering constraints in this method; that is the responsibility of the Set method.

slot Resolve element
  [訳註：この項目は､第9.03版取扱説明書から削除された] これは､細溝化された集塊の要素を､その解析した形式に変換する; 単純な値の場合､それは値を持ち帰るだけになり得る､但し､命令や級への参照を含む細溝に関しては､それらを､完全に資格を満たす形式に変換すべき(それ故string equalsと比較できる): それは､namespace which や､その類に､転送することで為される｡ This converts an element of the slotted collection into its resolved form; for a simple value, it could just return the value, but for a slot that contains references to commands or classes it should convert those into their fully-qualified forms (so they can be compared with string equals): that could be done by forwarding to namespace which or similar.

slot Set elementList
  細溝の内容をリスト elementList に設定して空文字列を返す｡この手段は常に oo::define か oo::objdefine への呼出しによって作成された棚枠から呼出されなければならない｡この手段は､もし細溝の内容拒への変更を拒否するか(譬えば､不適正な値の為に)恰も定義文脈の外から呼ばれるか､誤った個数の引数を伴っている場合には不都合を返すかもしれない｡ Sets the contents of the slot to the list elementList and returns the empty string. This method must always be called from a stack frame created by a call to oo::define or oo::objdefine. This method may return an error if it rejects the change to the slot contents (e.g., because of invalid values) as well as if it is called from outside a definition context or with the wrong number of arguments.

  もし細溝の基礎的な制限を満足させる必要がある場合には､この手段は､要素の再整列や､篩い落としがあるかもしれない｡(譬えば､級の細溝は唯一無二の制限が強制され､それぞれの要素を可能な限り細溝内の初期の位置に配置する｡) This method may reorder and filter the elements if this is necessary in order to satisfy the underlying constraints of the slot. (For example, slots of classes enforce a uniqueness constraint that places each element in the earliest location in the slot that it can.)

これ等の手段の実装は細溝に依存する(及び､級か対象の定義の正しい箇所の利用に責務がある)｡細溝はこれ等細片全てを相互に結びつける為の未知の手段処理機能を有し､それは､偶然に起動されないようその破壊手段を隠蔽する｡推奨される事柄は､どの使用者も､細溝の仕組みそのものは､その名前が横棒文字(ハイフン)で始まる様な新しい操作を定義する様に制限される様変更する事である｡ 　　 The implementation of these methods is slot-dependent (and responsible for accessing the correct part of the class or object definition). Slots also have an unknown method handler to tie all these pieces together, and they hide their destroy method so that it is not invoked inadvertently. It is recommended that any user changes to the slot mechanism itself be restricted to defining new operations whose names start with a hyphen.

註意すべきは､細溝即値は､それが管理している細溝の為の貯蔵を含むことは期待されていない; それは､それが管理している級か対象に内蔵か付着かになる｡その様な即値は､GetとSet手段の自己の実装を提供すべき｡(及び､任意追加でResolve; それは無為設定として､何もせず､見送る) Note that slot instances are not expected to contain the storage for the slot they manage; that will be in or attached to the class or object that they manage. Those instances should provide their own implementations of the Get and Set methods (and optionally Resolve; that defaults to a do-nothing pass-through).

大多数の細溝操作は最初に引数リストを解析し､ Get 手段の結果と結びつける､そして､結果を設定する｡幾つかの操作は最初の二つの一つあるいは両方を省略する; 三番目の省略は､読出し専用操作と同じ能力の結果になる(しかし､細溝からの読出しの標準的仕組みは､info class と info object 経由である)｡　　　　　　　　　　　　　　 Most slot operations will initially Resolve their argument list, combine it with the results of the Get method, and then Set the result. Some operations omit one or both of the first two steps; omitting the third would result in an idempotent read-only operation (but the standard mechanism for reading from slots is via info class and info object).

### 用例 EXAMPLES

この例は oo::define と oo::objdefine 命令(両者は同じ方法で働く)の両方の形式を､例示する４つのその副命令の様に､如何に使うかを例示する｡　　 This example demonstrates how to use both forms of the oo::define and oo::objdefine commands (they work in the same way), as well as illustrating four of their subcommands.

    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 が追加を運営する細溝になっているかを示す: 　　 This example shows how additional classes can be mixed into an object. It also shows how mixin is a slot that supports appending:

    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"

級へ数を如何に創生して使用するかを実証する用例｡そのものの実現地が幾つ作られたか勘定する級である｡ This example shows how to create and use class variables. It is a class that counts how many instances of itself have been made.

    oo::class create Counted
    oo::define Counted {
        initialise {
            variable count 0
        }

        variable number
        constructor {} {
            classvariable count
            set number [incr count]
        }

        method report {} {
            classvariable count
            puts "This is instance $number of $count"
        }
    }

    set a [Counted new]
    set b [Counted new]
    $a report
            → This is instance 1 of 2
    set c [Counted new]
    $b report
            → This is instance 2 of 3
    $c report
            → This is instance 3 of 3

級手段を如何に使用するかを実証する用例｡(註意すべきは､oo::class の為の構成子はこの級の上の oo::define を呼ぶ｡)　　　　　　　 This example demonstrates how to use class methods. (Note that the constructor for oo::class calls oo::define on the class.)

    oo::class create DBTable {
        classmethod find {description} {
            puts "DB: locate row from [self] matching $description"
            return [my new]
        }
        classmethod insert {description} {
            puts "DB: create row in [self] matching $description"
            return [my new]
        }
        method update {description} {
            puts "DB: update row [self] with $description"
        }
        method delete {} {
            puts "DB: delete row [self]"
            my destroy; # Just delete the object, not the DB row
        }
    }

    oo::class create Users {
        superclass DBTable
    }
    oo::class create Groups {
        superclass DBTable
    }

    set u1 [Users insert "username=abc"]
            → DB: create row from ::Users matching username=abc
    set u2 [Users insert "username=def"]
            → DB: create row from ::Users matching username=def
    $u2 update "group=NULL"
            → DB: update row ::oo::Obj124 with group=NULL
    $u1 delete
            → DB: delete row ::oo::Obj123
    set g [Group find "groupname=webadmins"]
            → DB: locate row ::Group with groupname=webadmins
    $g update "emailaddress=admins"
            → DB: update row ::oo::Obj125 with emailaddress=admins

この用例は､級の為の誂え定義を如何になすかを示す｡註意すべきは､明示的に名前空間経路 namespace path を経由する既存の定義命令への委任を含む｡ This example shows how to make a custom definition for a class. Note that it explicitly includes delegation to the existing definition commands via namespace path.

    namespace eval myDefinitions {
        # 上書きされない既存の定義への委任
        # Delegate to existing definitions where not overridden
        namespace path ::oo::define

        # 手段の誂え型
        # A custom type of method
        proc exprmethod {name arguments body} {
            tailcall method $name $arguments [list expr $body]
        }

        # 構成子を生成する誂え方法
        # A custom way of building a constructor
        proc parameters args {
            uplevel 1 [list variable {*}$args]
            set body [join [lmap a $args {
                string map [list VAR $a] {
                    set [my varname VAR] [expr {double($VAR)}]
                }
            }] ";"]
            tailcall constructor $args $body
        }
    }

    # 使用する(非常に簡単な)汎級の中に名前空間を束縛する
    # Bind the namespace into a (very simple) metaclass for use
    oo::class create exprclass {
        superclass oo::class
        definitionnamespace myDefinitions
    }

    # 誂え定義を使う
    # Use the custom definitions
    exprclass create quadratic {
        parameters a b c
        exprmethod evaluate {x} {
            ($a * $x**2) + ($b * $x) + $c
        }
    }

    # 実行中の結果となる級と対象を表示する
    # Showing the resulting class and object in action
    quadratic create quad 1 2 3
    for {set x 0} {$x <= 4} {incr x} {
        puts [format "quad(%d) = %.2f" $x [quad evaluate $x]]
    }
            → quad(0) = 3.00
            → quad(1) = 6.00
            → quad(2) = 11.00
            → quad(3) = 18.00
            → quad(4) = 27.00

### SEE ALSO

next, oo::class, oo::object

### KEYWORDS

class, definition, method, object, slot
Copyright © 2007-2018 Donal K. Fellows