## Tcl8.6.17/Tk8.6.17 Documentation > Tcl C API > 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
    Tcl_ClassGetMetadata, Tcl_ClassSetMetadata, Tcl_CopyObjectInstance, Tcl_GetClassAsObject, Tcl_GetObjectAsClass, Tcl_GetObjectCommand, Tcl_GetObjectFromObj, Tcl_GetObjectName, Tcl_GetObjectNamespace, Tcl_NewObjectInstance, Tcl_ObjectDeleted, Tcl_ObjectGetMetadata, Tcl_ObjectGetMethodNameMapper, Tcl_ObjectSetMetadata, Tcl_ObjectSetMethodNameMapper — 対象と級を操作する　 manipulate objects and classes
  SYNOPSIS
    #include <tclOO.h>
    Tcl_Object
    Tcl_GetObjectFromObj(interp, objPtr)
    Tcl_Object
    Tcl_GetClassAsObject(class)
    Tcl_Class
    Tcl_GetObjectAsClass(object)
    Tcl_Obj *
    Tcl_GetObjectName(interp, object)
    Tcl_Command
    Tcl_GetObjectCommand(object)
    Tcl_Namespace *
    Tcl_GetObjectNamespace(object)
    Tcl_Object
    Tcl_NewObjectInstance(interp, class, name, nsName, objc, objv, skip)
    Tcl_Object
    Tcl_CopyObjectInstance(interp, object, name, nsName)
    int
    Tcl_ObjectDeleted(object)
    ClientData
    Tcl_ObjectGetMetadata(object, metaTypePtr)
    Tcl_ObjectSetMetadata(object, metaTypePtr, metadata)
    ClientData
    Tcl_ClassGetMetadata(class, metaTypePtr)
    Tcl_ClassSetMetadata(class, metaTypePtr, metadata)
    Tcl_ObjectMapMethodNameProc
    Tcl_ObjectGetMethodNameMapper(object)
    Tcl_ObjectSetMethodNameMapper(object, methodNameMapper)
  引数 ARGUMENTS
    Tcl_Interp *interp (入出力in/out)
    Tcl_Obj *objPtr (入力in)
    Tcl_Object object (入力in)
    Tcl_Class class (入力in)
    const char *name (入力in)
    const char *nsName (入力in)
    int objc (入力in)
    Tcl_Obj *const *objv (入力in)
    int skip (入力in)
    Tcl_ObjectMetadataType *metaTypePtr (入力in)
    ClientData metadata (入力in)
    Tcl_ObjectMapMethodNameProc methodNameMapper (入力in)
  説明 DESCRIPTION
  対象と級汎データ OBJECT AND CLASS METADATA
  TCL_OBJECTMETADATATYPE STRUCTURE
  TCL_OBJECTMETADATADELETEPROC FUNCTION SIGNATURE
  TCL_CLONEPROC FUNCTION SIGNATURE
  OBJECT METHOD NAME MAPPING
  TCL_OBJECTMAPMETHODNAMEPROC FUNCTION SIGNATURE
  SEE ALSO
  KEYWORDS

### NAME

Tcl_ClassGetMetadata, Tcl_ClassSetMetadata, Tcl_CopyObjectInstance, Tcl_GetClassAsObject, Tcl_GetObjectAsClass, Tcl_GetObjectCommand, Tcl_GetObjectFromObj, Tcl_GetObjectName, Tcl_GetObjectNamespace, Tcl_NewObjectInstance, Tcl_ObjectDeleted, Tcl_ObjectGetMetadata, Tcl_ObjectGetMethodNameMapper, Tcl_ObjectSetMetadata, Tcl_ObjectSetMethodNameMapper — 対象と級を操作する　 manipulate objects and classes

### SYNOPSIS

#include <tclOO.h>
Tcl_Object
Tcl_GetObjectFromObj(interp, objPtr)
Tcl_Object
Tcl_GetClassAsObject(class)
Tcl_Class
Tcl_GetObjectAsClass(object)
Tcl_Obj *
Tcl_GetObjectName(interp, object)
Tcl_Command
Tcl_GetObjectCommand(object)
Tcl_Namespace *
Tcl_GetObjectNamespace(object)
Tcl_Object
Tcl_NewObjectInstance(interp, class, name, nsName, objc, objv, skip)
Tcl_Object
Tcl_CopyObjectInstance(interp, object, name, nsName)
int
Tcl_ObjectDeleted(object)
ClientData
Tcl_ObjectGetMetadata(object, metaTypePtr)
Tcl_ObjectSetMetadata(object, metaTypePtr, metadata)
ClientData
Tcl_ClassGetMetadata(class, metaTypePtr)
Tcl_ClassSetMetadata(class, metaTypePtr, metadata)
Tcl_ObjectMapMethodNameProc
Tcl_ObjectGetMethodNameMapper(object)
Tcl_ObjectSetMethodNameMapper(object, methodNameMapper)

### 引数 ARGUMENTS

Tcl_Interp *interp (入出力in/out)
  対象を捜すか生成する為の文脈をもたらし､又､不都合の場合に､その結果の中に不都合伝言文が書かれる解釈実行機能｡ 　　 Interpreter providing the context for looking up or creating an object, and into whose result error messages will be written on failure.

Tcl_Obj *objPtr (入力in)
  捜す為の対象の名前｡ The name of the object to look up.

Tcl_Object object (入力in)
  操作を施す為の対象への参照｡ Reference to the object to operate upon.

Tcl_Class class (入力in)
  操作を施す為の級への参照｡ Reference to the class to operate upon.

const char *name (入力in)
  生成する為の対象の名前､但し､新しい未使用の名前が自動的に選択された時は NULL ｡ 　 The name of the object to create, or NULL if a new unused name is to be automatically selected.

const char *nsName (入力in)
  対象の私的使用の為に生成する名前空間の名前､又は､新しい未使用の名前が自動的に選択された場合は NULL である｡名前空間は既存であってはならない｡ The name of the namespace to create for the object's private use, or NULL if a new unused name is to be automatically selected. The namespace must not already exist.

int objc (入力in)
  配列 objv 内の要素の数｡ The number of elements in the objv array.

Tcl_Obj *const *objv (入力in)
  級の即値を生成する為の命令への引数｡ 　 The arguments to the command to create the instance of the class.

int skip (入力in)
  引数配列 objv の開始に於ける引数の数､それはどの構成子の引数でもない｡これは､縦え複雑な呼出し類型が使われた時も､正しい不都合伝言文の生成を許容する(譬えば､next 命令経由)｡ The number of arguments at the start of the argument array, objv, that are not arguments to any constructors. This allows the generation of correct error messages even when complicated calling patterns are used (e.g., via the next command).

Tcl_ObjectMetadataType *metaTypePtr (入力in)
  Tcl_ClassSetMetadata に設定される､又は､Tcl_ClassGetMetadataにより取戻される metadataの型｡ The type of metadata being set with Tcl_ClassSetMetadata or retrieved with Tcl_ClassGetMetadata.

ClientData metadata (入力in)
  級に取付けるべき汎データの項目､又は特定の metaTypePtr と結合した汎データを除去する為の NULL ｡ An item of metadata to attach to the class, or NULL to remove the metadata associated with a particular metaTypePtr.

Tcl_ObjectMapMethodNameProc methodNameMapper (入力in)
  対象と実装すべき手段の名前の対応を調整する為に呼出すべき函数へのポインター､その様な対応が要求されない時は NULL ｡ 　　 A pointer to a function to call to adjust the mapping of objects and method names to implementations, or NULL when no such mapping is required.

### 説明 DESCRIPTION

対象は､型を有する実体であって､それに結合した操作の組("手段")を有している｡ 級は対象である､それは対象をでっち上げることができる｡それぞれの級は対象自身としても眺められる; 対象の外観は Tcl_GetClassAsObject を使って取出す事ができ､それは非破壊の級に適用された時いつも返され､又､対象は Tcl_GetObjectAsClass の補助を伴って級として眺められる(それは級を返すか対象が級でない場合は NULL を返す)｡対象は Tcl_GetObjectFromObj 函数を使って捜されそれは対象か､対象が見付らない場合は NULL を返す(解釈実行機能の結果内の不都合伝言文を伴う)｡名前により級を捜す正しい方法は名前で対象を捜すことであり､従って Tcl_GetObjectAsClass を使うことである｡ 　　　 Objects are typed entities that have a set of operations ("methods") associated with them. Classes are objects that can manufacture objects. Each class can be viewed as an object itself; the object view can be retrieved using Tcl_GetClassAsObject which always returns the object when applied to a non-destroyed class, and an object can be viewed as a class with the aid of the Tcl_GetObjectAsClass (which either returns the class, or NULL if the object is not a class). An object may be looked up using the Tcl_GetObjectFromObj function, which either returns an object or NULL (with an error message in the interpreter result) if the object cannot be found. The correct way to look up a class by name is to look up the object with that name, and then to use Tcl_GetObjectAsClass.

全ての対象は自己の命令とそれに結合した名前空間を有する｡その命令は Tcl_GetObjectCommand 函数を使って取出され得る､対象の名前は(又それ故命令の名前) Tcl_GetObjectName により､名前空間は Tcl_GetObjectNamespace を使って取出せる｡註意すべきは Tcl_GetObjectName に返された Tcl_Obj 参照は共有化された参照である｡対象が Tcl_ObjectDeleted によって(それは対象の削除が始まると真値を返す)削除用の印付けがされるかどうかも得られる；これは手段の処理の間は便利かもしれない｡ Every object has its own command and namespace associated with it. The command may be retrieved using the Tcl_GetObjectCommand function, the name of the object (and hence the name of the command) with Tcl_GetObjectName, and the namespace may be retrieved using the Tcl_GetObjectNamespace function. Note that the Tcl_Obj reference returned by Tcl_GetObjectName is a shared reference. You can also get whether the object has been marked for deletion with Tcl_ObjectDeleted (it returns true if deletion of the object has begun); this can be useful during the processing of methods.

級の実現値は Tcl_NewObjectInstance を使って作成され､それはどの級からも対象を作成する(又､それは内部的に oo::class 級の create と new 手段の両方から呼出される)｡それは対象の名前と作成すべき名前空間を与える假引数を追加的に取り､(もしあれば)級の構成譜に渡す引数を記述する｡函数の結果は新しく作成された対象への参照か､作成が失敗した時は NULL である(その時､不都合伝言文が解釈実行機能の結果に残される)｡更に､対象は Tcl_CopyObjectInstance を使って複写され､それはどの構成譜も実行されずに複写を作成する｡ Instances of classes are created using Tcl_NewObjectInstance, which creates an object from any class (and which is internally called by both the create and new methods of the oo::class class). It takes parameters that optionally give the name of the object and namespace to create, and which describe the arguments to pass to the class's constructor (if any). The result of the function will be either a reference to the newly created object, or NULL if the creation failed (when an error message will be left in the interpreter result). In addition, objects may be copied by using Tcl_CopyObjectInstance which creates a copy of an object without running any constructors.

注意すべきは､対象の生涯寿命の管理は TclOO 内部で､内部的に処理されている､又､Tcl_Preserve を使っていない｡Tcl_Object 操作子を寿命期間が対象と異なる C言語構造に入れることは安全ではない； 寧ろ対象の命令の名前(Tcl_GetObjectName で取得された通りに)を使用すべきである｡その対象上の手段の呼出の寿命の為に Tcl_Object 操作子を使うことは安全である； 操作子はその対象上に未決済の呼出がある間は不適格にはならない(縦えそれに対して安全が保障されている唯一の操作が Tcl_ObjectDeleted であっても； 他の操作が､非-削除 対象上の動作のみ保障されていても)｡ Note that the lifetime management of objects is handled internally within TclOO, and does not use Tcl_Preserve. It is not safe to put a Tcl_Object handle in a C structure with a lifespan different to the object; you should use the object's command name (as retrieved with Tcl_GetObjectName) instead. It is safe to use a Tcl_Object handle for the lifespan of a call of a method on that object; handles do not become invalid while there is an outstanding call on their object (even if the only operation guaranteed to be safe on them is Tcl_ObjectDeleted; the other operations are only guaranteed to work on non-deleted objects).

### 対象と級汎データ OBJECT AND CLASS METADATA

全ての対象及び全ての級はそれに付いた任意の量の汎データを有すかも知れず､その､対象や級がついているものは､ Tcl_ObjectMetadataType 構造実現値内では記述されている処では意味をもたない｡附加される汎データは汎データ型( metaTypePtr 引数内に与えられた)と Tcl_ObjectSetMetadata と Tcl_ClassSetMetadata に与えられた任意のポインター(汎データ引数)とにより記述され､特定の汎データの細片は Tcl_ObjectGetMetadata と Tcl_ClassGetMetadata を使ってその与えられた型が取出せる｡もし Tcl_ObjectSetMetadata か Tcl_ClassSetMetadata のどちらかへの metadata 假引数が NULL である場合､汎データは接続されていると取外され､汎データが接続されていないと Tcl_ObjectGetMetadata と Tcl_ClassGetMetadata の結果は NULL である｡接続されていない汎データの細片の取外し要求は不都合にはならない｡ Every object and every class may have arbitrary amounts of metadata attached to it, which the object or class attaches no meaning to beyond what is described in a Tcl_ObjectMetadataType structure instance. Metadata to be attached is described by the type of the metadata (given in the metaTypePtr argument) and an arbitrary pointer (the metadata argument) that are given to Tcl_ObjectSetMetadata and Tcl_ClassSetMetadata, and a particular piece of metadata can be retrieved given its type using Tcl_ObjectGetMetadata and Tcl_ClassGetMetadata. If the metadata parameter to either Tcl_ObjectSetMetadata or Tcl_ClassSetMetadata is NULL, the metadata is removed if it was attached, and the results of Tcl_ObjectGetMetadata and Tcl_ClassGetMetadata are NULL if the given type of metadata was not attached. It is not an error to request or remove a piece of metadata that was not attached.

#### TCL_OBJECTMETADATATYPE STRUCTURE

Tcl_ObjectMetadataType 構造の内容は次の通り: The contents of the Tcl_ObjectMetadataType structure are as follows:

    typedef const struct {
        int version;
        const char *name;
        Tcl_ObjectMetadataDeleteProc *deleteProc;
        Tcl_CloneProc *cloneProc;
    } Tcl_ObjectMetadataType;

version 欄は将来の構造の拡張を許容する､又常に TCL_OO_METADATA_VERSION_CURRENT に等しいと宣言される｡ name 欄は型の可視的名前を提供する､また､不具合修繕の為に予約されている｡ 　　　　　 The version field allows for future expansion of the structure, and should always be declared equal to TCL_OO_METADATA_VERSION_CURRENT. The name field provides a human-readable name for the type, and is reserved for debugging.

deleteProc 欄は Tcl_ObjectMetadataDeleteProc 型の函数を与える､それは特定の汎データの細片の削除に使われ､接続された汎データが置換又は取外された時に呼出される; その欄は NULL であってはならない｡ 　　　 The deleteProc field gives a function of type Tcl_ObjectMetadataDeleteProc that is used to delete a particular piece of metadata, and is called when the attached metadata is replaced or removed; the field must not be NULL.

cloneProc 欄は汎データの細片の複写に使われる函数を与える( Tcl_CopyObjectInstance を使って作成された対象の複写に使われる); もし NULL の場合､汎データは直接複写される｡ The cloneProc field gives a function that is used to copy a piece of metadata (used when a copy of an object is created using Tcl_CopyObjectInstance); if NULL, the metadata will be just directly copied.

#### TCL_OBJECTMETADATADELETEPROC FUNCTION SIGNATURE

この定義に合致する函数は級や対象に結合した汎データの削除に使われる｡ Functions matching this signature are used to delete metadata associated with a class or object.

    typedef void Tcl_ObjectMetadataDeleteProc(
            ClientData metadata);

metadata 引数は削除される汎データの番地を与える｡ The metadata argument gives the address of the metadata to be deleted.

#### TCL_CLONEPROC FUNCTION SIGNATURE

この定義に合致する函数は級や対象に結合した汎データの複写の作成に使われる｡ Functions matching this signature are used to create copies of metadata associated with a class or object.

    typedef int Tcl_CloneProc(
            Tcl_Interp *interp,
            ClientData srcMetadata,
            ClientData *dstMetadataPtr);

interp 引数は対象の複製の試みが失敗した時に不都合伝言文を書く為の場所を与える､その場合､複製手続函数も TCL_ERROR を返さなければならない; そうでなければ TCL_OK を返す｡ srcMetadata 引数は複製される汎データの番地を与える､又複製された汎データは dstMetadataPtr に指される変数の中に書かれる; 汎データが複製されない場合は NULL が書かれるが､全体の対象の複写操作は依然成功である｡ The interp argument gives a place to write an error message when the attempt to clone the object is to fail, in which case the clone procedure must also return TCL_ERROR; it should return TCL_OK otherwise. The srcMetadata argument gives the address of the metadata to be cloned, and the cloned metadata should be written into the variable pointed to by dstMetadataPtr; a NULL should be written if the metadata is to not be cloned but the overall object copy operation is still to succeed.

### OBJECT METHOD NAME MAPPING

特定の手段が起動された時､どの手段が起動されるかは対象を基本に制御できるかもしれない｡通常これは手段の名前を対象の内部及び級階層構造中を捜索する事により遂行されるが､ 捜索の遂行に使用される値の正確な精密制御は､手段名称を Tcl_ObjectSetMethodNameMapper (及び､その内部相当品の Tcl_ObjectGetMethodNameMapper ､それは現在の対応函数を返す)経由で実行登録に設定する能力を通して与えられる｡ 現在の対応付け函数は(それがあれば)使われるべき手段の実装の連鎖を調査する直前に起動される｡ 　 It is possible to control, on a per-object basis, what methods are invoked when a particular method is invoked. Normally this is done by looking up the method name in the object and then in the class hierarchy, but fine control of exactly what the value used to perform the look up is afforded through the ability to set a method name mapper callback via Tcl_ObjectSetMethodNameMapper (and its introspection counterpart, Tcl_ObjectGetMethodNameMapper, which returns the current mapper). The current mapper (if any) is invoked immediately before looking up what chain of method implementations is to be used.

#### TCL_OBJECTMAPMETHODNAMEPROC FUNCTION SIGNATURE

Tcl_ObjectMapMethodNameProc 実行登録は次のように定義される: 　　 The Tcl_ObjectMapMethodNameProc callback is defined as follows:

    typedef int Tcl_ObjectMapMethodNameProc(
            Tcl_Interp *interp,
            Tcl_Object object,
            Tcl_Class *startClsPtr,
            Tcl_Obj *methodNameObj);

もし結果が TCL_OK の場合､再対応が完了したことが仮定される｡もし結果が TCL_ERROR の場合､不都合伝言文が interp に残され､手段呼出しは失敗する｡もし結果が TCL_BREAK であると､規則を調査する標準手段名が使われる; 他の結果符号の挙動は現在は定義されていない｡ object 假引数はどの対象が処理されているかを告げる｡ startClsPtr 假引数は手段連鎖内で処理される定義を与える為の最初の級を含むか､全部の連鎖が処理されるときは NULL である(引数事態は NULL にならない); この変数は回収により更新される｡ methodNameObj 假引数は使用者に与えられたとして､起動される手段の名前を含む非共有対象を与える; この対象は回収により更新される｡ If the result is TCL_OK, the remapping is assumed to have been done. If the result is TCL_ERROR, an error message will have been left in interp and the method call will fail. If the result is TCL_BREAK, the standard method name lookup rules will be used; the behavior of other result codes is currently undefined. The object parameter says which object is being processed. The startClsPtr parameter points to a variable that contains the first class to provide a definition in the method chain to process, or NULL if the whole chain is to be processed (the argument itself is never NULL); this variable may be updated by the callback. The methodNameObj parameter gives an unshared object containing the name of the method being invoked, as provided by the user; this object may be updated by the callback.

### SEE ALSO

Method, oo::class, oo::copy, oo::define, oo::object

### KEYWORDS

class, constructor, object
Copyright © 2007 Donal K. Fellows