オブジェクトのプロパティ

Curl 言語におけるクラス型のオブジェクトには、必ず属性が設定されています。これらの属性は、フィールドアクセッサローカル オプション、または非ローカル オプションとして保持されています。これらの属性の種類を区別する必要がない場合、これらをまとめてオブジェクトのプロパティと呼びます。オブジェクトのプロパティを表すには、次のようにドット表記を使います。
object.property
オブジェクトのプロパティは、次のような構文で使用できます。
{value object.property}
set object.property = new-value
このフォーマットは、メソッド呼び出しのように中カッコで囲む必要はありません。また、これらの属性は個々のオブジェクトに属しているので、そのフォーマットはクラス変数、クラス定数、およびクラス プロシージャのフォーマットとは異なります。クラス変数、クラス定数、およびクラス プロシージャは、必ずクラス名で修飾する必要があります (例:ClassName.class-constant{ClassName.class-method ...})。

オブジェクトのプロパティの使用

一般にオブジェクトのプロパティを使うには、そのプロパティの名前を覚えておくだけで十分です。例として、グラフィック オブジェクトまたはそのコンテナに設定されているプロパティの一部を次に示します。
これらのどの種類のプロパティにアクセスする場合でも同じドット表記を使うので、一般にそれぞれのプロパティの種類を気にする必要はありません。たとえば、次のようなコードを記述できます (注:このコードは単なる記述例であり、実際に機能するものではありません)。
|| Disable a command button:
set my-button.enabled? = false

|| Find the box containing the command button:
set my-box:Box = my-button.parent

|| Test the box's layout:
{if not my-box.layout-valid? then

    || Hide the box:
    set my-box.visible? = false
}
このコードでは、各プロパティがアクセッサ、フィールド、ローカル オプション、非ローカル オプションのどの種類であるかを検査する必要はありません。
プロパティのそれぞれの種類については、「フィールドとアクセッサ」および「オプション」を参照してください。

名前を指定することによるプロパティの取得と設定

あるオブジェクトにどのプロパティが設定されているかを知らない状態で、実行時にそのオブジェクトの一部のプロパティの値を検査したり、そのようなプロパティに新しい値を代入しなければならない、というケースがあります。たとえば、グラフィック オブジェクトのプロパティを無作為に検査する場合や、Curl コードを生成するインターフェイスを他ユーザーのために作成する場合などが考えられます。
2 つの特別なプロシージャを使うことにより、このような処理を実行できます。1 つはプロパティの現在値を検査するプロシージャ、もう 1 つはオブジェクトの任意のパブリック プロパティに新しい値を代入するプロシージャです。
構文:
{get-public-property object:any, property:String}:any
{set-public-property object:Object, property:String, new-value:any}:void
説明:
objectオブジェクト。
property任意のパブリックなフィールド、オプション、またはアクセッサの名前。
new-valueproperty に代入する値。
これらの各プロシージャに対する引数の 1 つはプロパティ名です。プロパティ名は String として指定されているので、実行時にユーザー入力から簡単に取得できます。
この 2 つのプロシージャは、パブリック プロパティしか扱えません。つまり、これらのプロシージャを使ってオプション、フィールド、またはアクセッサの値を取得または変更する場合、それらのプロパティの定義時に public アクセス属性が設定されている必要があります。propertypublic アクセス属性が設定されている場合、get-public-property によって返される値は次の式を評価した結果と同じになります。
object.property
同様に、set-public-property は次の式を実行した結果と同じになります。
{set object.property = new-value}
注意: constantが定義されているフィールドの値や、パブリックのゲッターはあるがセッターがないクラスメンバーの多くのプロパティは、クエリできるが変更することはできません。public でないプロパティまたは変更不能なプロパティを設定しようとすると、実行エラーが発生します。