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

### 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::extendedclass — 対象の拡張級を生成する　　　　create a extendedclass of objects
  警告WARNING!
  構文 SYNOPSIS
  説明 DESCRIPTION
  級の定義 CLASS DEFINITIONS
    extendedclass extendedclassName definition
    inherit baseExtendedclass ?baseExtendedclass...?
    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
    extendedclassName objName ?args...?
  対象の使用方法 OBJECT USAGE
    objName method ?args...?
  組込み手段BUILT-IN METHODS
    objName cget option
    objName configure ?option? ?value option value ...?
    objName isa extendedclassName
    objName info option ?args...?
      objName info extendedclass
      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?
  手段/手続関数の連鎖CHAINING METHODS/PROCS
  自動積込みAUTO-LOADING
  C 言語手続函数 C PROCEDURES
  KEYWORDS

### NAME

itcl::extendedclass — 対象の拡張級を生成する　　　　create a extendedclass of objects

### 警告WARNING!

API が猶も変化するかもしれない [incr Tcl] 内で､これは新しい機能である!!　　　　　 This is new functionality in [incr Tcl] where the API can still change!!

### 構文 SYNOPSIS

itcl::extendedclass extendedclassName {
inherit baseExtendedclass ?baseExtendedclass...?
constructor args ?init? body
destructor body
public method name ?args? ?body?
protected method name ?args? ?body?
private method name ?args? ?body?
public proc name ?args? ?body?
protected proc name ?args? ?body?
private proc name ?args? ?body?
public variable varName ?init? ?config?
protected variable varName ?init? ?config?
private variable varName ?init? ?config?
public common varName ?init?
protected common varName ?init?
private common varName ?init?
public command ?arg arg ...?
protected command ?arg arg ...?
private command ?arg arg ...?
<delegation info> see delegation page
<option info> see option page
set varName ?value?
array option ?arg arg ...?
}
extendedclassName objName ?arg arg ...?
objName method ?arg arg ...?
extendedclassName::proc ?arg arg ...?

### 説明 DESCRIPTION

[incr Tcl] 内の基本的構造は拡張級の定義である｡ それぞれの拡張級は生成され得る実際の対象の為の雛形として振舞う｡ 拡張級自身は､全ての対象に共通のものを含む名前空間である｡ それぞれの対象は拡張級の中で定義された "変数" の即値を含む自身の独特なデータの束を有する｡ それぞれの対象は､対象の名前を含む "this" と言う名前の組込み変数を有する｡ 拡張級は､拡張級内の全ての対象に共有されている "共通" データ要員をも有する事ができる｡　　　　 The fundamental construct in [incr Tcl] is the extendedclass definition. Each extendedclass acts as a template for actual objects that can be created. The extendedclass 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 extendedclass definition. Each object also has a built-in variable named "this", which contains the name of the object. Extendedclasses can also have "common" data members that are shared by all objects in a extendedclass.

二つの型の機能が拡張級定義の中に含まれる｡ "Methods" は固有の対象の上の操作であり､従って "変数" と "共通" データ要員の両方を利用させる｡ "手続函数 Procs" は拡張級名前空間内の通常の手続函数であり､ "共通 common" データ要員のみを利用させる｡　　　　　　 Two types of functions can be included in the extendedclass 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 extendedclass 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 extendedclass can only be defined once, although the bodies of extendedclass methods and procs can be defined again and again for interactive debugging. See the body and configbody commands for details.

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

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

### 級の定義 CLASS DEFINITIONS

extendedclass extendedclassName definition
  extendedclassName と言う名前の拡張級について定義を提供する｡ もし､その拡張級 extendedclassName が既に実在するか､ extendedclassName に呼ばれた命令が現在の名前空間文脈に内に実在する場合､この命令は不都合を返す｡ もし､拡張級の定義が成功裏に解析されると､ extendedclassName は現在の文脈の中の命令になり､この拡張級についての対象の生成を取扱う｡　　　　 Provides the definition for a extendedclass named extendedclassName. If the extendedclass extendedclassName already exists, or if a command called extendedclassName exists in the current namespace context, this command returns an error. If the extendedclass definition is successfully parsed, extendedclassName becomes a command in the current context, handling the creation of objects for this extendedclass.

拡張級 definition は､拡張級内部で要素を定義している Tcl 宣言の並びとして評価される｡ 次の拡張級定義命令が認識される: 　　　　　 The extendedclass definition is evaluated as a series of Tcl statements that define elements within the extendedclass. The following extendedclass definition commands are recognized:

inherit baseExtendedclass ?baseExtendedclass...?
  現在の拡張級に一つ或はそれ以上の基礎の拡張級から特性を継承することを起こさせる｡ 拡張級は以前にextendedclass 命令によって定義済か自動積込み便益(下の "AUTO-LOADING" を参照されたい)によって利用可能でなければならない｡ 一個の拡張級定義は一つより多くの 継承 inherit 命令を含むことはできない｡　　　　　 Causes the current extendedclass to inherit characteristics from one or more base extendedclasses. Extendedclasses must have been defined by a previous extendedclass command, or must be available to the auto-loading facility (see "AUTO-LOADING" below). A single extendedclass definition can contain no more than one inherit command.

  継承 inherit リスト内の拡張級 baseExtendedclass 名前の順番は拡張級の要員に関する名前の決定法に影響を及ぼす｡ 同じ要員の名前が二つ或はそれ以上の基礎拡張級内に現れた場合､基礎拡張級は､継承 inherit リスト内に先に現れた方が優先する｡ 譬えば､もし拡張級 "Foo" と "Bar" の両方が要員 "x" を含み､且つ､他の拡張級が次の "継承 inherit" 宣言を有する場合: 　　　　　 The order of baseExtendedclass names in the inherit list affects the name resolution for extendedclass members. When the same member name appears in two or more base extendedclasses, the base extendedclass that appears first in the inherit list takes precedence. For example, if extendedclasses "Foo" and "Bar" both contain the member "x", and if another extendedclass 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.

  body が実行される前に､追加的 init 宣言は､引数を要求するどの基礎拡張級構築子を起動する為にも使われる｡ args指定内の変数は､ init 符号命令断片内で利用でき､基礎拡張級構築子に渡すことができる｡ init 宣言の評価の後､実行されていないどの基礎拡張級構築子も､引数なしに自動的に起動される｡ これにより､全ての基礎拡張級は､構築子 body が実行される前に､完全に構築される｡ 無為設定により､この仕組みは､最も漠然から最も具体的指定の順に構築子が起動されることを惹き起こす｡ これは､ info heritage 命令によって報告される拡張級の順序の正確に逆順である｡　　　　　 Before the body is executed, the optional init statement is used to invoke any base extendedclass constructors that require arguments. Variables in the args specification can be accessed in the init code fragment, and passed to base extendedclass constructors. After evaluating the init statement, any base extendedclass constructors that have not been executed are invoked automatically without arguments. This ensures that all base extendedclasses 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 extendedclasses 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 extendedclass hierarchy are invoked in order from most- to least-specific. This is the order that the extendedclasses 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.

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

proc name ?args? ?body?
  name と呼ばれる手続函数を宣言する｡手続函数は拡張級名前空間内部の通常の手続函数である｡ 手段とは違い､手続函数は特定の対象の参照なしに起動できる｡ 手続函数 body が実行されている時､それは自動的に共有データ要員のみを利用させることになる｡　　　　　　 Declares a proc called name. A proc is an ordinary procedure within the extendedclass 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.

  他の拡張級手段や手続函数の本体の内部では､手続函数は何か他の命令のように-単にその名前を使うだけで､起動することができる｡ その外のどの名前空間文脈内でも､手続函数は､ "extendedclassName::proc" の様に､修飾した名前を使って起動される｡ 現在の拡張級内で再定義されたか､他の基礎拡張級によって隠蔽された､基礎拡張級内の手続函数は､その修飾された名前経由で利用され得る｡　　　　　　 Within the body of another extendedclass 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 "extendedclassName::proc". Procs in a base extendedclass that are redefined in the current extendedclass, or hidden by another base extendedclass, 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 extendedclass 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 extendedclass definition using the configbody command.

common varName ?init?
  varName と言う名前の共有変数を宣言する｡ 共有変数は拡張級の名前空間内に駐在し､拡張級に属する全ての対象によって共有される｡ それらは､大域変数と良く似ているが､通常の global 命令を使用して宣言する必要はないことが異なる｡ それらは､自動的に全ての拡張級手段や手続函数内で可視である｡　　　　　　 Declares a common variable named varName. Common variables reside in the extendedclass namespace and are shared by all objects belonging to the extendedclass. They are just like global variables, except that they need not be declared with the usual global command. They are automatically visible in all extendedclass 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 extendedclass definition. This allows common data members to be initialized as arrays. For example:

      itcl::extendedclass 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 extendedclass 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 extendedclass has been defined, the extendedclass name can be used as a command to create new objects belonging to the extendedclass.

extendedclassName objName ?args...?
  拡張級 extendedclassName 内に､名前が objName の新しい対象を生成する｡ 残りの引数は最も具体的指定拡張級の構築子に渡される｡これにより､その自身の命令の本体が起動される前に､順番に引数を基礎拡張級構築子に引渡す｡ もし構築子が成功すると､objName に呼出された命令が現在の名前空間文脈内に生成され､その操作の結果として objName が返される｡ 構築中に不都合に遭遇すると､割当てられたどの原資も解消する為に自動的に破壊子が起動され､対象が消去され､不都合が返される｡　　　　　　 Creates a new object in extendedclass extendedclassName with the name objName. Remaining arguments are passed to the constructor of the most-specific extendedclass. This in turn passes arguments to base extendedclass 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" を含むと､その文字列は自動的に創造された名前に置き換えられる｡ 名前は extendedclassName<number> の形式を有し､ここで extendedclassName の部位は小文字で始まる様に修正される｡ 譬えば､ "Toaster" の拡張級内では､この "#auto" の指定は toaster0, toaster1 等々 の様な名前を生成することになる｡ 註意すべきは､ "#auto" は対象の名前の内部にも埋め込まれることがある:　　　　　　 If objName contains the string "#auto", that string is replaced with an automatically generated name. Names have the form extendedclassName<number>, where the extendedclassName part is modified to start with a lowercase letter. In extendedclass "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 extendedclass 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 部品に対する便利な "cget" 操作の振舞いを模擬する｡ 引数なしでは､この手段は全ての公共変数を記述するリストを返す｡ それぞれのリストは３つの要素を有する､即ち: 変数の名前と､その初期値と､現在の値｡　　　　　　 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 extendedclass 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 extendedclassName
  もし与えられた extendedclassName が対象の継承内に見付かると非零を返し､そうでない場合は零を返す｡　　　　　　 Returns non-zero if the given extendedclassName 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 extendedclass definition. The option parameter includes the following things, as well as the options recognized by the usual Tcl "info" command:

  objName info extendedclass
    対象 objName の為の最も特定の拡張級の名前を返す｡ 　　　　　　 Returns the name of the most-specific extendedclass for object objName.

  objName info inherit
    "inherit" 命令内で定義された通りの基礎拡張級のリストを返すか､もしこの拡張級が基礎拡張級を有さない場合は空文字列を返す｡　　　　　　 Returns the list of base extendedclasses as they were defined in the "inherit" command, or an empty string if this extendedclass has no base extendedclasses.

  objName info heritage
    現在の拡張級の名前と､要員の捜索と対象の破壊に関して巡回する順序に従った､拡張級の名前の完全なリストとを返す｡　　　　　　 Returns the current extendedclass name and the entire list of base extendedclasses 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 extendedclass 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?
    引数がないとこの命令は全ての対象固有の変数と共通データ要員のリストを返す｡ もし varName が指定されていると､特定のデータ要員についての情報を返す｡ もし旗印が指定されていないと､この命令は､次の要素のリストを返す､即ち: 保護水準､型(手段/手続函数)､修飾された名前､初期値､現在値｡ もし varName が公共変数の場合､ "config" 符号命令がこのリストに含まれる｡ 旗印は､このリストから特定の要素を要求するために使用することができる｡　　　　　　 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. If no flags are specified, this command returns a list with the following elements: the protection level, the type (variable/common), the qualified name, the initial value, and the current value. If varName is a public variable, the "config" code is included on this list. Flags can be used to request specific elements from this list.

### 手段/手続関数の連鎖CHAINING METHODS/PROCS

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

    itcl::extendedclass 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 extendedclass like SmartToaster that redefines the "toast" method. If we want to access the base extendedclass method, we can qualify it with the base extendedclass name, to avoid ambiguity:

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

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

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

この連結命令は､幾分か一般的(拡張基礎の級の)な手段や手続函数の実装の為に､拡張級の階層を通して捜索し､特定の引数を伴ってそれを起動する｡現在の拡張級文脈から出発し､ "info heritage" 命令によって報告された順序で基礎拡張級を通して捜索する｡ もし他の実装が見付らない場合､この命令は何もせず空文字列を返す｡　　　　　　 The chain command searches through the extendedclass hierarchy for a slightly more generic (base extendedclass) implementation of a method or proc, and invokes it with the specified arguments. It starts at the current extendedclass context and searches through base extendedclasses 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] 拡張級定義と定義が見付かるファイルを識別する｡　　　　　　 Extendedclass definitions need not be loaded explicitly; they can be loaded as needed by the usual Tcl auto-loading facility. Each directory containing extendedclass definition files should have an accompanying "tclIndex" file. Each line in this file identifies a Tcl procedure or [incr Tcl] extendedclass definition and the file where the definition can be found.

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

    # Tcl 自動積込み索引ファイル､ [incr Tcl] の 2.0 版
    # このファイルは "auto_mkindex" 命令により生成され､
    # 一つ或いはそれ以上の命令の為の索引情報を据ゑ付ける
    # 為の原資となる｡典型的には各行は自動索引配列内の
    # 要素を設定する命令である､茲で要素の名前は
    # 命令の名前であり､値は命令を積込む記述譜である｡
    #
    # 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"

auto_mkindex 命令は "tclIndex" ファイルを自動的に生成する為に使用される｡　　　　　　 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, extendedclasses 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] extendedclass 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.

記号名は 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, extendedclass data members can be accessed like ordinary variables using Tcl_SetVar(), Tcl_GetVar(), Tcl_TraceVar(), etc. Extendedclass 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. Extendedclasses 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

extendedclass, object, object-oriented
Copyright © 2008 Arnulf Wiedemann