クラスの概要
クラスが使えることによってDelphiのプログラミング言語はObject Pascalと呼ぶことができます。Delphiにとってクラスほど重要な要素はないかもしれません。クラスを理解し、クラスを使いこなすことができれば、Delphiの達人と言えると思います。
クラスはオブジェクトそのものではなく、オブジェクトを作るための設計図あるいは型枠あるいはDNAのようなものです。オブジェクトはクラスをインスタンス化(型枠としてのクラスを使って実際の物を作るようなこと)することで作ることができます。Delphiのプログラムは、1つ以上のクラスを定義することによって成り立っています。そして、自動的に作成されたApplicationオブジェクトがユーザが定義したクラスをインスタンス化して、目的の動作を実行させるようになっています。
ふつう、ビジュアル(可視)コンポーネントのインスタンス化はDelphiが自動的に行ってくれます。例えば、フォームやフォームに貼り付けたボタンなどもクラスですが、これらのインスタンス化は自動的に行われます。しかし、設計時も実行時も不可視のコンポーネント(クラス)はユーザがプログラミングによってインスタンス化する必要があります。例えば、TRegIniFileはこのようなものの1つです。
クラスの構造
クラスの一般形式はつぎのとおりです。
<クラスの名前> = class <ヘリテージ>
<コンポーネントリスト>または<可視性指定子>の並び
end;
クラスの名前は例えば、TForm1などです。
ヘリテージはカッコ()で囲まれたオブジェクトの型名で、例えばTFormなどです。ヘリテージは基本クラスの性質を、そのクラスに受け継ぐとき使用します(つまり省略できます)。通常は、全く新しいクラスを作るのは面倒なので、すでにあるクラス(特にDelphiが持っているクラス)の機能を使えるようにTFormやTComponentなどを指定します。
コンポーネントリストはフィールド定義、メソッド定義、プロパティ定義の並びです。フィールド定義とはメンバ変数(そのクラスに属する変数)です。メソッド定義とは、そのクラスに属する手続きや関数のことです。プロパティ定義はPropertyで始まる行で、手続きや関数をメンバ変数のように見せるためのからくりです。
可視性指定子とは、private、protected、public、publishedのいずれかで、クラスのインスタンスを外部のルーチンがアクセスするときのルールを適用するための指定です。
可視性指定子 | 機能 |
private | クラスの中だけで使える |
protected | クラスの中と継承により派生したクラスから使える |
public | クラスの外からも使える |
published | クラスの外からと設計時(オブジェクトインスペクタで)に使える |
つぎのクラスはDelphiが自動的に生成したクラス(フォーム)の一部です。TForm1 = class(TForm)からprivateまでの部分はDelphiが管理しているのでエディタで編集してはいけません。
クラスの例
TForm1 = class(TForm) Label1: TLabel; txtName: TEdit; cmdCreate: TButton; cmdClose: TButton; ・・・・ procedure cmdCloseClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure cmdReadClick(Sender: TObject); procedure cmdWriteClick(Sender: TObject); procedure cmdClearClick(Sender: TObject); private { Private 宣言 } FHandle: Integer; public { Public 宣言 } constructor Create(); destructor Destroy(); procedure SetData(d: Integer); function IsValid(): Boolean; end;
メソッド
メソッドはクラスに属する関数や手続きですが、クラス定義の外に(implementation部分)にその実装(プログラム)を書きます。メソッドはどのクラスに属するかを区別するため、メソッド名の前にクラス名を付けます。
例
procedure TForm1.SetData(d: Integer); begin ・・・・ end;
コンストラクタ(constructor)とデストラクタ(destructor) は、特殊なメソッドです。コンストラクタはクラスがインスタンス化されるときの初期処理を行います。デストラクタは、クラスのインスタンスがメモリから削除されるときの処理を行います。
-
プロパティ
プロパティは、クラスの(privateやprotected)メンバ変数を読み出したり書き込んだりするときに使用します。プロパティは、単純な読み出しや書き込みでなく、その動作が行われたとき何か別の動作も同時に行いたいときなどに有効です(これを副作用と呼びます)。プロパティの一般的な書き方の例を示します。
例
property Volume : Smallint read GetVolume write SetVolume default 0;
(storedやnodefaultなどのキーワードもありますがここでは省略します)
これは、Volumeプロパティを読むときは、GetVolumeメソッドを呼び出し、書き込むときはSetVolumeメソッドを呼び出すことを示しています。default 0はデフォルト値指定でオブジェクトインスペクタに表示されます。必要のないときは、これらのメソッド指定やデフォルトは省略できます。
また、メソッド指定の代わりに直接、メンバ変数を指定することもできます。
クラスの継承
クラスの継承はオブジェクト指向の最も優れた機能のひとつです。クラスを継承すると、継承したクラス(派生クラス)は、継承されたクラス(基本クラス)の機能をそのまま受け継ぐことができます。例えば、基本クラスに数値積分を行うメソッド(privateではないとします)があったとします。これで、派生クラスは難しい数値積分をしなくてすみます。
クラスの継承はクラスの構造で述べたヘリテージに基本クラス名を指定するだけで簡単にできます。ただし、コンストラクタで、基本クラスのコンストラクタを呼び出すときは、inherited予約語を使って基本クラスのコンストラクタを呼び出さなければなりません。
例
constructor TMyClass.Create;
begin
inherited Create;
・・・・
end;
しかし継承を行っても、基本クラスのprivateメソッドと変数にはアクセスできません。