クラス
概要
4D ランゲージでは クラス の概念がサポートされています。 プログラミング言語では、クラスを利用することによって、属性やメソッドなどを持つ特定のオブジェクト種を定義することができます。
ユーザークラスが定義 されていれば、そのクラスのオブジェクトをコード内で インスタンス化 することができます。 各オブジェクトは、それ自身が属するクラスのインスタンスです。 クラスは、別のクラスを 継承 することで、その 関数 と、(宣言された および 計算された) プロパティを受け継ぐことができます。
4D におけるクラスモデルは JavaScript のクラスに類似しており、プロトタイプチェーンに基づきます。
たとえば、次のように Person
クラスを定義した場合:
// クラス: Person.4dm
Class constructor($firstname : Text; $lastname : Text)
This.firstName:=$firstname
This.lastName:=$lastname
Function get fullName() -> $fullName : Text
$fullName:=This.firstName+" "+This.lastName
Function sayHello() -> $welcome : Text
$welcome:="Hello "+This.fullName
この "Person" のインスタンスをメソッド内で作成するには、以下のように書けます:
var $person : cs.Person // Person クラスのオブジェクト
var $hello : Text
$person:=cs.Person.new("John";"Doe")
// $person:{firstName: "John"; lastName: "Doe"; fullName: "John Doe"}
$hello:=$person.sayHello() // "Hello John Doe"
クラスの管理
クラス定義
4D においてユーザークラスとは、/Project/Sources/Classes/
フォルダーに保存された専用の メソッド ファイル (.4dm) によって定義されます。 ファイル名がクラス名になります。
クラスを命名する際には、次のルールに留意してください:
- クラス名 は プロパティ名の命名規則 に準拠している必要があります。
- クラス名の大文字・小文字は区別されます。
- 競合防止のため、データベースのテーブルと同じ名前のクラスを作成するのは推奨されないこと
たとえば、"Polygon" という名前のクラスを定義するには、次のファイルを作成する必要があります:
Project フォルダー Project Sources Classes Polygon.4dm
クラスの削除
既存のクラスを削除するには:
- ディスク上で "Classes" フォルダーより .4dm クラスフ ァイルを削除します。
- 4D エクスプローラーでは、クラスを選択した状態で
をクリックするか、コンテキストメニューより 移動 > ゴミ箱 を選択します。
4D インターフェースの使用
ファイル メニューまたはエクスプローラーなど、4D インターフェースを介してクラスを作成した場合には、クラスファイルは自動的に適切な場所に保存されます。
ファイルメニューとツールバー
4D 開発の ファイル メニューまたはツールバーより 新規 > クラス... を選択することで、開いているプロジェクトにクラスファイルを新規作成することができます。
Ctrl+Shift+Alt+k ショートカットも使用できます。
エクスプローラー
エクスプローラーの メソッド ページにおいて、クラスは クラス カテゴリに分類されています。
クラスを新規作成するには次の方法があります:
- クラス カテゴリを選択し、
ボタンをクリックします。
- エクスプローラーウィンドウの下部にあるアクションメニュー、またはクラスグループのコンテキストメニューから 新規クラス... を選択します。
- エクスプローラーのホームページのコンテキストメニューより 新規 > クラス... を選択します。
クラスのコードサポート
各種 4Dウィンドウ (コードエディター、コンパイラー、デバッガー、ランタイムエクスプローラー) において、クラスコードは "特殊なプロジェクトメソッド" のように扱われます:
- コードエディター:
- クラスは実行できません
- クラスメソッドはコードのブロックです
- オブジェクトメンバーに対する 定義に移動 操作はクラスの Function 宣言を探します。例: "$o.f()" の場合、"Function f" を見つけます。
- クラスのメソッド宣言に対する 参照箇所を検索 操作は、そのメソッドがオブジェクトメンバーとして使われている箇所を探します。例: "Function f" の場合 "$o.f()" を見つけます。
- ランタイムエクスプローラーおよびデバッガーにおいて、クラスメソッドは
<ClassName>
コンストラクターまたは<ClassName>.<FunctionName>
形式で表示されます。
クラスストア
定義されたクラスには、クラスストア よりアクセスすることができます。 クラスストアには次の二つが存在します:
cs
- ユーザークラスストア4D
- ビルトインクラスストア
cs
cs : Object
引数 | タイプ | 説明 | ||
---|---|---|---|---|
classStore | Object | <- | プロジェクトまたはコンポーネントのユーザークラスストア |
cs
コマンドは、カレントプロジェクトまたはコンポーネントのユーザークラスストアを返します。 これには、プロジェクトまたはコンポーネントにて 定義 されている、すべてのユーザークラスが含まれます。 デフォルトでは、 ORDAクラス のみ利用可能です。
例題
myClass
オブジェクトの新規インスタンスを作成するには、次のように書きます:
$instance:=cs.myClass.new()
4D
4D : Object
引数 | タイプ | 説明 | ||
---|---|---|---|---|
classStore | Object | <- | 4Dクラスストア |
4D
コマンドは、ビルトイン 4Dクラスのクラスストアを返します。 CryptoKey などの専用 API へのアクセスを提供します。
例題
CryptoKey
クラスに新規キーを作成するには、次のように書きます:
$key:=4D.CryptoKey.new(New object("type";"ECDSA";"curve";"prime256v1"))
Class オブジェクト
プロジェクトにおいてクラスが 定義 されていれば、それは 4Dランゲージ環境に読み込まれます。 クラスとは、それ自身が "Class" クラス のオブジェクトです。 Class オブジェクトは次のプロパティや関数を持ちます:
name
文字列superclass
オブジェクト (無い場合は null)new()
関数 (Class オブジェクトをインスタンス化します)isShared
プロパティ (クラスが 共有されている場合に true)isSingleton
プロパティ (シングルトンの場合に true)me
プロパティ (シングルトン をインスタンス化および取得します)
また、Class オブジェクトは constructor
オブジェクトを参照することも可能です (任意)。
Class オブジェクトそのものは 共有オブジェクト です。 したがって、異なる 4Dプロセスから同時にアクセスすることができます。
継承
クラス宣言において Class extends キーワードを使うと、そのクラスは親クラス (つまり スーパークラス
) を継承します。
関数やプロパティがクラス内で見つからない場合、4D はそのクラスの スーパークラス 内を検索します。 見つからない場合、4D はさらに、そのスーパークラスのスーパークラス内を探します。 これは、スーパークラスが存在しなくなるまで続きます (すべてのオブジェクトは "Object" スーパークラスを継承しています)。