## Tcl9.0.3/Tk9.0.3 Documentation > [incr Tcl] Package Commands, version 4.3.5 > class

### 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
    itcl::class — 対象の級の生成 　　create a class of objects
  SYNOPSIS
  説明 DESCRIPTION
  級定義CLASS DEFINITIONS
    class className definition
    inherit baseClass ?baseClass...?
    constructor args ?init? body
    destructor body
    method name ?args? ?body?
    proc name ?args? ?body?
    variable varName ?init? ?config?
    common varName ?init?
    public command ?arg arg ...?
    protected command ?arg arg ...?
    private command ?arg arg ...?
  級の用途 CLASS USAGE
    className objName ?args...?
  対象の用途 OBJECT USAGE
    objName method ?args...?
  組込み手段 BUILT-IN METHODS
    objName cget option
    objName configure ?option? ?value option value ...?
    objName isa className
    objName info option ?args...?
      objName info class
      objName info inherit
      objName info heritage
      objName info function ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body?
      objName info variable ?varName? ?-protection? ?-type? ?-name? ?-init? ?-value? ?-config? ?-scope?
  級/手段の変更 CHAINING METHODS/PROCS
  自動積込み AUTO-LOADING
  C 言語手続函数 C PROCEDURES
  KEYWORDS

### NAME

itcl::class — 対象の級の生成 　　create a class of objects

### SYNOPSIS

itcl::class className {
`` inherit baseClass ?baseClass...?
`` constructor args ?init? body
`` destructor body
`` method name ?args? ?body?
`` proc name ?args? ?body?
`` variable varName ?init? ?config?
`` common varName ?init?
`` public command ?arg arg ...?
`` protected command ?arg arg ...?
`` private command ?arg arg ...?
`` set varName ?value?
`` array option ?arg arg ...?
}
className objName ?arg arg ...?
objName method ?arg arg ...?
className::proc ?arg arg ...?

### 説明 DESCRIPTION

[incr Tcl] 内の基本的な構築は級の定義である｡それぞれの級は作成され得る実際の対象の雛形として振舞う｡級自身は名前空間であり､全ての対象に共通のものを含む｡それぞれの対象は､級定義内で定義された "変数" の即値を含む自身の唯一のデータの束を有することができる｡級は又､全ての対象の中で共有されている "共通" データ要員も有する事ができる｡　　　　 The fundamental construct in [incr Tcl] is the class definition. Each class acts as a template for actual objects that can be created. The class itself is a namespace which contains things common to all objects. Each object has its own unique bundle of data which contains instances of the "variables" defined in the class definition. Each object also has a built-in variable named "this", which contains the name of the object. Classes can also have "common" data members that are shared by all objects in a class.

級定義内には二つの型の函数が含まれ得る｡ "Methods" は特定の対象上で操作する函数であり､従って､それに "変数" と "共通" データ要員の両方を利用させる｡ "Procs" は名前空間級内の通常の手続函数なので､"共通" データ要員のみを利用させる｡ 　　　 Two types of functions can be included in the class definition. "Methods" are functions which operate on a specific object, and therefore have access to both "variables" and "common" data members. "Procs" are ordinary procedures in the class namespace, and only have access to "common" data members.

もしどれかの手段や手続函数の本体が"@"で始まる場合､それは C 言語手続函数の為の記号名称として取扱われる｡それ以外の場合は､ Tcl 符号記述譜として扱われる｡ C 言語手続函数の登録と使用に就いての詳細は下を参照されたい｡ 　　　　　 If the body of any method or proc starts with "@", it is treated as the symbolic name for a C procedure. Otherwise, it is treated as a Tcl code script. See below for details on registering and using C procedures.

級は唯一度だけしか定義できないが､級の手段と手続函数の本体は対話的瑕疵修正の為に繰返し定義できる｡詳細については body と configbody 命令を参照されたい｡ 　　　　 A class can only be defined once, although the bodies of class methods and procs can be defined again and again for interactive debugging. See the body and configbody commands for details.

それぞれの名前空間は対象と級を自己用の蒐集品とする事ができる｡現在の文脈内で利用できる級のリストは "itcl::find classes" 命令を使って問合せできる､又､対象のリストは "itcl::find objects" 命令によって問合せできる｡ 　　　　 Each namespace can have its own collection of objects and classes. The list of classes available in the current context can be queried using the "itcl::find classes" command, and the list of objects, with the "itcl::find objects" command.

級は "delete class" 命令を使用して削除できる｡個別の対象は "delete object" 命令を使用して削除できる｡　　　　 A class can be deleted using the "delete class" command. Individual objects can be deleted using the "delete object" command.

### 級定義CLASS DEFINITIONS

class className definition
  className と謂ふ名前の級の為の定義を提供する｡もし級 className が既に実在するか､className に呼ばれた命令が現在の名前空間文脈内に実在する場合､この命令は不都合を返す｡もし級定義が成功裡に解析できると､ className は現在の文脈の中で命令になり､この級のための対象の生成を処理する｡　　　　 Provides the definition for a class named className. If the class className already exists, or if a command called className exists in the current namespace context, this command returns an error. If the class definition is successfully parsed, className becomes a command in the current context, handling the creation of objects for this class.

級の定義は､級内の要員を定義している Tcl 文の並びとして評価される｡次の級定義命令が承認されている: 　　　 The class definition is evaluated as a series of Tcl statements that define elements within the class. The following class definition commands are recognized:

inherit baseClass ?baseClass...?
  現在の級に一つ或はそれ以上の基礎の級の特性を受け継がせる｡級はそれ以前のclass 命令によって既に定義されているか､或は自動-積込み便益に利用できなければならない(下の "AUTO-LOADING" を参照のこと)｡ 一つの級の定義はたった一つの inherit 命令しか含むことができない｡　　　 Causes the current class to inherit characteristics from one or more base classes. Classes must have been defined by a previous class command, or must be available to the auto-loading facility (see "AUTO-LOADING" below). A single class definition can contain no more than one inherit command.

  inherit リスト内の baseClass 名の順序は級の要員についての名前の決定に影響を与える｡ 二つ或はそれ以上の基礎級内に同じ要員の名前が現れた場合は､ inherit リスト内に最初に現れた基礎級が優先する｡ 譬えば､級 "Foo" と "Bar" の両方が要員"x" を含み､且つ､他の級が次の "inherit" 宣言を有する場合:　　　　 The order of baseClass names in the inherit list affects the name resolution for class members. When the same member name appears in two or more base classes, the base class that appears first in the inherit list takes precedence. For example, if classes "Foo" and "Bar" both contain the member "x", and if another class has the "inherit" statement:

      inherit Foo Bar

  その場合､名前 "x" は "Foo::x" を意味する｡他の､"x" の名前の付いた傘下の要員は､ "Bar::x"の如き､明示的名称を使わねばならない｡　　　　　 then the name "x" means "Foo::x". Other inherited members named "x" must be referenced with their explicit name, like "Bar::x".

constructor args ?init? body
  何時であれ､対象が作成された時に自動的に起動される構築子に使用される args 引数リストと body を宣言する｡　　　　　　 Declares the args argument list and body used for the constructor, which is automatically invoked whenever an object is created.

  この追加的 init 宣言は､body が実行される前に､引数を要求する何かの基礎級構築子を起動する為に使われる｡ args 指定内の変数は init 命令符号断片内で利用でき､基礎的な級の構築子に渡される｡ init 宣言の評価の後には､実行されていないどの基礎級構築子も､引数なしに自動的に起動される｡ これにより､構築子の body 本体 が実行される前に全ての基礎級が完全に構築される｡ 無為設定では､この仕組は構築子が漠然とした指定から具体的指定の順に起動されるようにさせる｡ これは info heritage 命令によって報告された級の順番の正確な逆順である｡　　　　　 Before the body is executed, the optional init statement is used to invoke any base class constructors that require arguments. Variables in the args specification can be accessed in the init code fragment, and passed to base class constructors. After evaluating the init statement, any base class constructors that have not been executed are invoked automatically without arguments. This ensures that all base classes are fully constructed before the constructor body is executed. By default, this scheme causes constructors to be invoked in order from least- to most-specific. This is exactly the opposite of the order that classes are reported by the info heritage command.

  もし構築が成功すると､構築子は常に対象の名前- 本体 body が如何に定義されたかは考慮せずに-を返し､対象名は現在の名前空間状文脈内で命令になる｡もし構築が失敗すると不都合伝言文が返される｡ 　　　　　 If construction is successful, the constructor always returns the object name-regardless of how the body is defined-and the object name becomes a command in the current namespace context. If construction fails, an error message is returned.

destructor body
  対象が削除される時に自動的に起動される破壊子に使用される本体 body を定義する｡ もし破壊子が成功するとその対象データは破壊され､対象の名前は解釈実行機能から命令としては除去される｡もし破壊が失敗すると､不都合伝言文が返され､対象は残留する｡ 　　　　 Declares the body used for the destructor, which is automatically invoked when an object is deleted. If the destructor is successful, the object data is destroyed and the object name is removed as a command from the interpreter. If destruction fails, an error message is returned and the object remains.

  対象が破壊される時､その級階層内の全ての破壊子は最も具体的指定から漠然とした指定の順に起動される｡これは "info heritage" 命令によって報告された級の順であり､無為設定の構築子の順の正確に逆順である｡　　　　 When an object is destroyed, all destructors in its class hierarchy are invoked in order from most- to least-specific. This is the order that the classes are reported by the "info heritage" command, and it is exactly the opposite of the default constructor order.

method name ?args? ?body?
  name と呼ばれる手段を定義する｡手段 body が実行される時は自動的に対象-固有変数と共通データ要員を利用させる｡　　　　 Declares a method called name. When the method body is executed, it will have automatic access to object-specific variables and common data members.

  もし args リストが指定されている場合はこの手段の情報の用途を確立する｡ body 命令は手段本体の再定義に使用できるが､ args リストはこの指定に合致しなければならない｡　　　　 If the args list is specified, it establishes the usage information for this method. The body command can be used to redefine the method body, but the args list must match this specification.

  他の級手段の本体内で手段は何か他の命令の様に-単にその名前を使用するだけで､起動することができる｡その級文脈の外部では､その手段の名前は､それが操作するデータの為の文脈を提供する対象の名前に先行していなければならない｡ 現在の級内で再定義されたり､他の基礎級によって隠蔽されている､基礎級内の手段は "className::method" 構文を使用して修飾することができる｡　　　　 Within the body of another class method, a method can be invoked like any other command-simply by using its name. Outside of the class context, the method name must be prefaced an object name, which provides the context for the data that it manipulates. Methods in a base class that are redefined in the current class, or hidden by another base class, can be qualified using the "className::method" syntax.

proc name ?args? ?body?
  name と呼ばれる函数手続を定義する｡函数手続は級名前空間内部の通常の手続函数である｡手段とは異なり､手続函数は固有の対象に参照されることなく起動される｡手続函数 body が実行される時は､自動的に共通データ要員のみを利用させる｡　　　　 Declares a proc called name. A proc is an ordinary procedure within the class namespace. Unlike a method, a proc is invoked without referring to a specific object. When the proc body is executed, it will have automatic access only to common data members.

  もし args リストが指定されている場合はこの手段の情報の用途を確立する｡ body 命令は手段本体の再定義に使用できるが､ args リストはこの指定に合致しなければならない｡　　　　 If the args list is specified, it establishes the usage information for this proc. The body command can be used to redefine the proc body, but the args list must match this specification.

  他の級の手段又は手続函数の本体内部で､手続函数は何か他の命令の様に-単にその名前を使用するだけで､起動することができる｡ 他のどの名前空間の文脈内でも､手続函数は､ "className::proc" の様な修飾した名前を使用して起動される｡ 現在の級内で再定義されたり､他の基礎級によって隠蔽されている､基礎級内の手続函数も､修飾された名前から利用することができる｡　　　　　 Within the body of another class method or proc, a proc can be invoked like any other command-simply by using its name. In any other namespace context, the proc is invoked using a qualified name like "className::proc". Procs in a base class that are redefined in the current class, or hidden by another base class, can also be accessed via their qualified name.

variable varName ?init? ?config?
  varNameと名付けられた対象固有の変数を定義する｡全ての対象固有変数は自動的に級手段内で利用できる｡それらは何か global 命令の様なもので宣言される必要はない｡　　　 Defines an object-specific variable named varName. All object-specific variables are automatically available in class methods. They need not be declared with anything like the global command.

  新しい対象が生成された時に､ init 文字列が指定されていると､変数の初期値として使用される｡初期化は変数に単純変数値であることを強制する; それに対して､初期化されない変数は構築子内部で設定され配列として使うことができる｡　　　　　　 If the optional init string is specified, it is used as the initial value of the variable when a new object is created. Initialization forces the variable to be a simple scalar value; uninitialized variables, on the other hand, can be set within the constructor and used as arrays.

  追加的 config 記述譜は公共変数としてのみ許容される｡もし指定されると､この命令符号断片は､何時であれ公共変数が組込み "configure" 手段により修正される時に実行される｡ config 記述譜も､configbody 命令を使用して級の定義の外側で指定され得る｡　　　　 The optional config script is only allowed for public variables. If specified, this code fragment is executed whenever a public variable is modified by the built-in "configure" method. The config script can also be specified outside of the class definition using the configbody command.

common varName ?init?
  varName と名付けられた共通変数を定義する｡共通変数は級名前空間内に駐在し､級に属する全ての対象により共有される｡それらは､通常の global 命令によって宣言する必要がないことを除き､恰も大域変数の様である｡それらは全ての級手段と手続函数内で自動的に可視である｡　　　　 Declares a common variable named varName. Common variables reside in the class namespace and are shared by all objects belonging to the class. They are just like global variables, except that they need not be declared with the usual global command. They are automatically visible in all class methods and procs.

  もし追加的 init 文字列が指定されている場合は､変数の初期値として利用される｡ 初期化は変数に単純変数値であることを強制する; それに対して､初期化されない変数は set と array 命令の並びにより設定でき配列として使われる｡　　　　　　 If the optional init string is specified, it is used as the initial value of the variable. Initialization forces the variable to be a simple scalar value; uninitialized variables, on the other hand, can be set with subsequent set and array commands and used as arrays.

  共通データ要員は一たび定義されると､その級定義内部で､set と array 命令を使用して設定することができる｡これにより共通データ要員は配列として初期化されるようになる｡譬えば:　　　　　 Once a common data member has been defined, it can be set using set and array commands within the class definition. This allows common data members to be initialized as arrays. For example:

      itcl::class Foo {
          common boolean
          set boolean(true) 1
          set boolean(false) 0
      }

  註意すべきは､もし共通データ要員が構築子の内部で初期化された場合､何時であれ新しい対象が生成された時は繰返し繰り返し初期化される｡　　　　 Note that if common data members are initialized within the constructor, they get initialized again and again whenever new objects are created.

public command ?arg arg ...?

protected command ?arg arg ...?

private command ?arg arg ...?
  これ等の命令は､ command が評価された時に生成される級についての保護水準の設定に利用される｡ この command は通常は method か proc か variable か common かであり､又､残りの argは要員の定義を完成する｡ 但し､command は又､多くの異なる要員の定義を含む記述譜であってもよく､又､保護水準は生成される全ての要員に適用されることになる｡　　　　 These commands are used to set the protection level for class members that are created when command is evaluated. The command is usually method, proc, variable orcommon, and the remaining arg's complete the member definition. However, command can also be a script containing many different member definitions, and the protection level will apply to all of the members that are created.

### 級の用途 CLASS USAGE

一たび級が定義されると､その級の名前はその級に属する新しい対象を生成する命令として使用できる｡　　　　 Once a class has been defined, the class name can be used as a command to create new objects belonging to the class.

className objName ?args...?
  級 className 内に objName という名前の新しい対象を生成する｡残りの引数は最も具体的指定の構築子に渡される｡これにより､その自身の命令の本体が起動される前に､順番に引数を基礎級構築子に引渡す｡構築が成功すると､objName に呼出された命令が現在の名前空間文脈内に生成され､その操作の結果として objName が返される｡構築中に不都合に遭遇すると､割当てられたどの原資も解消する為に自動的に破壊子が起動され､対象が消去され､不都合が返される｡　　　　 Creates a new object in class className with the name objName. Remaining arguments are passed to the constructor of the most-specific class. This in turn passes arguments to base class constructors before invoking its own body of commands. If construction is successful, a command called objName is created in the current namespace context, and objName is returned as the result of this operation. If an error is encountered during construction, the destructors are automatically invoked to free any resources that have been allocated, the object is deleted, and an error is returned.

  もしobjName が文字列 "#auto" を含む場合､その文字列は自動的に創造された名前に置き換えられる｡名前は className<number> の形式を有し､ここで className の部位は小文字で始まる様に修正される｡譬えば､ "Toaster" の級内では､この "#auto" の指定は toaster0, toaster1, 等の名前を生成することになる｡註意すべきは､ "#auto" も対象の名前の内部に埋め込まれ得る:　　　　　　 If objName contains the string "#auto", that string is replaced with an automatically generated name. Names have the form className<number>, where the className part is modified to start with a lowercase letter. In class "Toaster", for example, the "#auto" specification would produce names like toaster0, toaster1, etc. Note that "#auto" can be also be buried within an object name:

      fileselectiondialog .foo.bar.#auto -background red

  これにより".foo.bar.fileselectiondialog0"と謂ふ名前の対象が創造される｡　　　　　 This would generate an object named ".foo.bar.fileselectiondialog0".

### 対象の用途 OBJECT USAGE

一たび対象が創造されると､対象の名前はその対象を操作する手段を起動する命令として使用できる｡　　　 Once an object has been created, the object name can be used as a command to invoke methods that operate on the object.

objName method ?args...?
  method と言う名前の手段を objName と言う対象上で起動する｡ 残りの引数は手段の為の引数リストに渡される｡手段の名前は "constructor" や "destructor" であるかもしれず､級の定義内にどの手段や､それに引続くどの組込み手段の名前も現れ得る｡　　　　　 Invokes a method named method on an object named objName. Remaining arguments are passed to the argument list for the method. The method name can be "constructor", "destructor", any method name appearing in the class definition, or any of the following built-in methods.

### 組込み手段 BUILT-IN METHODS

objName cget option
  構成設定指定として公共変数への利用を提供する｡これはTk 部品に対する通常の "cget" 操作の振舞いを模擬する｡ option 引数は"-varName" 形式の文字列であり､又､この手段は公共変数varNameの現在の値を返す｡　　 Provides access to public variables as configuration options. This mimics the behavior of the usual "cget" operation for Tk widgets. The option argument is a string of the form "-varName", and this method returns the current value of the public variable varName.

objName configure ?option? ?value option value ...?
  構成設定指定として公共変数への利用を提供する｡これはTk 部品に対する便利な "configure" 操作の振舞いを模擬する｡ 引数がない場合､この手段は全ての公共変数を記述する並びのリストを返す｡ それぞれのリストは､三つの要素を有する: 変数名､その初期値､その現在値｡　　　 Provides access to public variables as configuration options. This mimics the behavior of the usual "configure" operation for Tk widgets. With no arguments, this method returns a list of lists describing all of the public variables. Each list has three elements: the variable name, its initial value and its current value.

  もし "-varName" の形式の option が一つ指定された場合､この手段はその一個の変数に関する情報を返す｡　　　　 If a single option of the form "-varName" is specified, then this method returns the information for that one variable.

  そうでない場合､引数は新しい値を公共変数に代入する option/value 対として扱われる｡ それぞれの変数はその新しい値が代入され､もし何かそれに結合した "config" 符号命令を有している場合､それが定義された級の文脈内で実施される｡もし "config" 符号命令が不都合を生成すると､変数は以前の値に戻して設定され､configure 手段は不都合を返す｡　　　　 Otherwise, the arguments are treated as option/value pairs assigning new values to public variables. Each variable is assigned its new value, and if it has any "config" code associated with it, it is executed in the context of the class where it was defined. If the "config" code generates an error, the variable is set back to its previous value, and the configure method returns an error.

objName isa className
  与えられた className が対象の階層構造内に見付けられれば非零を返し､それ以外は零を返す｡　　　　 Returns non-zero if the given className can be found in the object's heritage, and zero otherwise.

objName info option ?args...?
  objName と 言う名前の特定の対象か､その級の定義か､に関連する情報を返す｡ option 媒介変数は､通常の Tcl "info" 命令により認識された指示項目の如く次の事柄を含む: 　　　 Returns information related to a particular object named objName, or to its class definition. The option parameter includes the following things, as well as the options recognized by the usual Tcl "info" command:

  objName info class
    対象 objName の為の最も具体的な級の名前を返す｡　　　　 Returns the name of the most-specific class for object objName.

  objName info inherit
    "inherit" 命令内での定義に従い基礎級のリストを返すが､級が基礎級を有さない場合は空文字列を返す｡　　　　 Returns the list of base classes as they were defined in the "inherit" command, or an empty string if this class has no base classes.

  objName info heritage
    現在の級の名前と基礎の級の全体を､要員の捜索や分解の為に巡回する順序のリストにして返す｡　　　　 Returns the current class name and the entire list of base classes in the order that they are traversed for member lookup and object destruction.

  objName info function ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body?
    引数がない場合､この命令は級の全ての手段と手続函数のリストを返す｡ もしcmdNameが指定されると､指定した手段又は手続函数の情報を返す｡ もしどの旗印も指定されないと､この命令は次の要素のリストを返す: 保護水準､型(手段/手続函数)､修飾名､引数リスト､本体｡旗印指定はこのリストから要素の指定を要求することに使うことができる｡　　　　　　　　　 With no arguments, this command returns a list of all class methods and procs. If cmdName is specified, it returns information for a specific method or proc. If no flags are specified, this command returns a list with the following elements: the protection level, the type (method/proc), the qualified name, the argument list and the body. Flags can be used to request specific elements from this list.

  objName info variable ?varName? ?-protection? ?-type? ?-name? ?-init? ?-value? ?-config? ?-scope?
    引数がない場合､この命令は対象-固有変数と共通データ要員の全てのリストを返す｡もし varName が指定されると､特定のデータ要員に関する情報を返す｡旗徴は varName と伴に任意の順序で指定可能である｡結果は､旗徴として指定されたと厳密に同じ順序の､特定の情報のリストである｡もし旗徴が与えられない場合､この命令は次に示す旗徴が指定されたかの如くリストを返して来る： With no arguments, this command returns a list of all object-specific variables and common data members. If varName is specified, it returns information for a specific data member. Flags can be specified with varName in an arbitrary order. The result is a list of the specific information in exactly the same order as the flags are specified. If no flags are given, this command returns a list as if the followings flags have been specified:

    -protection -type -name -init -value ?-config? -config 結果は､もし varName が公開変数の場合のみ存在する｡それは varName の初期化の時に実行される符号命令を含む｡ -scope 旗徴は varName の名前空間文脈を与える｡これとともに､変数は､他のどの変数からの如く､対象の外部から利用できる｡iitcl::scope の結果と似ている｡ The -config result is only present if varName is a public variable. It contains the code that is executed at initialization of varName. The -scope flag gives the namespace context of varName. Herewith the variable can be accessed from outside the object like any other variable. It is similar to the result of the itcl::scope command.

### 級/手段の変更 CHAINING METHODS/PROCS

時には､基礎級は誘導された級内の同じ名前に再定義された手段や手続函数を有する｡ これは､誘導された級に基礎の級として自身の固有の振舞いによって､同じ操作を処理させる方法である｡譬えば､ここでパン焼き級を仮定する､このように: Sometimes a base class has a method or proc that is redefined with the same name in a derived class. This is a way of making the derived class handle the same operations as the base class, but with its own specialized behavior. For example, suppose we have a Toaster class that looks like this:

    itcl::class Toaster {
        variable crumbs 0
        method toast {nslices} {
            if {$crumbs > 50} {
                error "== FIRE! FIRE! =="
            }
            set crumbs [expr {$crumbs+4*$nslices}]
        }
        method clean {} {
            set crumbs 0
        }
    }

ここで､"toast" 手段を再定義する利口なパン焼きの様な級を別に創造することもできよう｡ もし基礎の級手段を利用したい場合､基礎の級の名前により不明瞭さを回避して修飾することができる､: 　　　　 We might create another class like SmartToaster that redefines the "toast" method. If we want to access the base class method, we can qualify it with the base class name, to avoid ambiguity:

    itcl::class SmartToaster {
        inherit Toaster
        method toast {nslices} {
            if {$crumbs > 40} {
                clean
            }
            return [Toaster::toast $nslices]
        }
    }

基礎級の名前をしつこく符号化する代りに､このように "chain" 命令を使用することができる: 　　　　 Instead of hard-coding the base class name, we can use the "chain" command like this:

    itcl::class SmartToaster {
        inherit Toaster
        method toast {nslices} {
            if {$crumbs > 40} {
                clean
            }
            return [chain $nslices]
        }
    }

この chain 命令は､幾分か一般的(基礎の級の)な手段や手続函数の実装の為に､級の階層を通して捜索し､特定の引数を伴ってそれを起動する｡現在の級文脈から出発し､"info heritage" 命令によってそれらが報告された順序で基礎級を通して捜索する｡ もし他の実装が見付られない場合､この命令は何もせず空文字列を返す｡ The chain command searches through the class hierarchy for a slightly more generic (base class) implementation of a method or proc, and invokes it with the specified arguments. It starts at the current class context and searches through base classes in the order that they are reported by the "info heritage" command. If another implementation is not found, this command does nothing and returns the null string.

### 自動積込み AUTO-LOADING

級の定義は明示的の積込まれる必要はない; それらは必要に応じて通常の Tcl 自動積込み便益によって積込まれるかもしれない｡ 級の定義ファイルを含むそれぞれのディレクトリーは "tclIndex"ファイルを伴うのが望ましい｡ このファイルの各行は Tcl 手続函数か [incr Tcl] 級の定義と､定義が見つかるファイルを識別する｡　　　　　　　　 Class definitions need not be loaded explicitly; they can be loaded as needed by the usual Tcl auto-loading facility. Each directory containing class definition files should have an accompanying "tclIndex" file. Each line in this file identifies a Tcl procedure or [incr Tcl] class definition and the file where the definition can be found.

譬えば､"Toaster" と "SmartToaster" の級の定義を含むディレクトリーを仮定する｡すると､このディレクトリーの為の "tclIndex" ファイルはこのようになる: 　　　　 For example, suppose a directory contains the definitions for classes "Toaster" and "SmartToaster". Then the "tclIndex" file for this directory would look like:

    # Tcl autoload index file, version 2.0 for [incr Tcl]
    # このファイルは "auto_mkindex" 命令によって創生され､一つ又は
    # それ以上の命令に関し､番号情報を設定する為に源資にされた｡
    # 典型的には､それぞれの行が auto_index 配列内の要素に設定
    # する命令であり､茲で､要素名は命令の名前であり､値は命令を
    # 積込む記述譜である｡
    # Tcl autoload index file, version 2.0 for [incr Tcl]
    # This file is generated by the "auto_mkindex" command
    # and sourced to set up indexing information for one or
    # more commands.  Typically each line is a command that
    # sets an element in the auto_index array, where the
    # element name is the name of a command and the value is
    # a script that loads the command.

    set auto_index(::Toaster) "source $dir/Toaster.itcl"
    set auto_index(::SmartToaster) "source $dir/SmartToaster.itcl"

"tclIndex" ファイルの自動生成には auto_mkindex 命令が使われる｡　　　　 The auto_mkindex command is used to automatically generate "tclIndex" files.

自動積込み機能はディレクトリー名を "auto_path" 変数に追記させることにより､このディレクトリーに気付かせなければならない｡これが行われた時､級は応用譜内で使用された時に必要に応じて自動積込みされることになる｡　　　　　 The auto-loader must be made aware of this directory by appending the directory name to the "auto_path" variable. When this is in place, classes will be auto-loaded as needed when used in an application.

### C 言語手続函数 C PROCEDURES

C 言語手続函数は､手段や､手続函数や､公共変数の為の "config" 命令符号を実装する為の[incr Tcl] 級定義の中に集約できる｡ "@"で始まるどの本体も C 言語手続函数の為の記号名として扱われる｡　　　　　 C procedures can be integrated into an [incr Tcl] class definition to implement methods, procs, and the "config" code for public variables. Any body that starts with "@" is treated as the symbolic name for a C procedure.

C 言語手続函数についての記号名称は Itcl_RegisterObjC() 経由で手続函数の登録により確立される｡ これは通常､解釈実行機能が始動する時に自動的に呼出される Tcl_AppInit() 手続函数内で実行される｡ 次の実施例の中で手続函数 My_FooObjCmd() は記号名称 "foo" として登録される｡この手続函数は body 命令の中で "@foo" として参照することができる｡　　　　　 　　 Symbolic names are established by registering procedures via Itcl_RegisterObjC(). This is usually done in the Tcl_AppInit() procedure, which is automatically called when the interpreter starts up. In the following example, the procedure `My_FooObjCmd()` is registered with the symbolic name "foo". This procedure can be referenced in the body command as "`@foo`".

    int
    Tcl_AppInit(interp)
        Tcl_Interp *interp;     /* Interpreter for application. */
    {
        if (Itcl_Init(interp) == TCL_ERROR) {
            return TCL_ERROR;
        }

        if (Itcl_RegisterObjC(interp, "foo", My_FooObjCmd) != TCL_OK) {
            return TCL_ERROR;
        }
    }

C 言語手続函数は､通常の Tcl 命令のように実装される｡詳細については CrtCommand 取扱説明書の頁を参照されたい｡手続函数の内部では､級データ要員は Tcl_SetVar(), Tcl_GetVar(), Tcl_TraceVar() 等を使用して通常の変数の様に利用できる｡級手段と手続函数は Tcl_Eval() を使用して通常の命令のように実行できる｡ [incr Tcl]はC 言語手続函数を実行する前に､これが可能になる様に自動的に文脈を準備する｡　　　　 C procedures are implemented just like ordinary Tcl commands. See the CrtCommand man page for details. Within the procedure, class data members can be accessed like ordinary variables using Tcl_SetVar(), Tcl_GetVar(), Tcl_TraceVar(), etc. Class methods and procs can be executed like ordinary commands using Tcl_Eval(). [incr Tcl] makes this possible by automatically setting up the context before executing the C procedure.

この仕組みは符号命令開発の為の自然な移行経路を提供する｡級は､本体を実装する為に Tcl 符号命令を使用して､素早く開発できる｡全体の応用譜が総機械語翻訳でき試験できる｡ 必要な場合には､出来栄えの改良の為に､個別の本体を C 言語符号で実装することも可能である｡　　　　　 This scheme provides a natural migration path for code development. Classes can be developed quickly using Tcl code to implement the bodies. An entire application can be built and tested. When necessary, individual bodies can be implemented with C code to improve performance.

### KEYWORDS

class, object, object-oriented
Copyright © 1993-1998 Lucent Technologies, Inc.