(「オブジェクト指向の考え方を徹底する - Delphi 開発について語る」のパート 3)
最初の 2 つの記事では、カプセル化に関連するトピックについて説明しました。ここでは、継承とポリモーフィズムについてお話したいと思います。
継承とポリモーフィズムは密接に関係しています。 Object Pascal は、オーバーロードと呼ばれるポリモーフィックなメカニズムを導入しています。その考え方はオブジェクト指向とはほとんど関係がないため、ここでは説明しません。私たちが注目しているのは、オブジェクト指向の考え方と密接に関係しているポリモーフィズムです。
ポリモーフィズムは抽象メソッドと仮想メソッドの概念に依存しており、継承とも密接に関係しています。多くの場合、基礎となるオブジェクトをいくつか定義し、その実装の一部を抽象として定義すると考えられます。これは、特定の実装の詳細を定義せずにインターフェイスのみを定義することを意味します。この考え方に従って、祖先クラスに実装されていない詳細が実際に実装される、複数の派生 (継承) オブジェクトも定義します。これにより、以前に定義した基になるクラスが多態性になります。このメカニズムの利点は、これらのクラスを使用するときに、1 セットのコードだけで複数の機能を完了できることです。変更する必要があるのは、オブジェクトのインスタンスを作成する部分だけです。
次のようなクラスを観察してください。
TStream = クラス(TObject)
…
公共
関数 Read(var Buffer; カウント:倍長整数): 仮想;
関数 Write(const バッファ; カウント:倍長整数): 仮想;
…
終わり;
仮想予約語と抽象予約語は、Read メソッドと Write メソッドが純粋な仮想関数であることを示します。これは、TStream クラスが実際には使用できない (このクラスのインスタンスを作成できない) ことを示しています。これは、TStream クラスが持つ必要があり、処理する必要がある基本的な関数を定義する、インターフェイスに似たクラスにすぎません。また、TStream クラスから派生した他のクラスが関数 (Read や Write など) を実装する必要があることも規定しています。
たとえば、TFileStream はディスク ファイル アプリケーションの形式で TStream クラスを実装し、TMemoryStream はメモリ アプリケーションの形式で TStream クラスを実装します。次に、SaveToStream メソッドを提供するクラス TMyClass があるとします。
TMyClass = クラス(TObject)
プロシージャ SaveToStream(Stream: TStream);
終わり;
次に、ポリモーフィズムの考え方を適用すると、次のようなコードを作成できます。
変数
strm: TStream;
MyClass: TMyClass;
始める
strm := TFileStream.Create('abc.txt'); // ß ここでの Stream の実際のインスタンス タイプは TFileStream です。
MyClass := TMyClass.Create;
MyClass.SaveToStream(strm);
……
終わり;
MyClass の内容をメモリに保存するには、次のように変更します。
strm := TFileStream.Create('abc.txt');
のために:
strm := TMemoryStream.Create;
それでおしまい。
ポリモーフィズムを使用するには、2 つの側面の作業が必要です。1 つは、もちろん、クラス構造でポリモーフィズムが考慮され、特定の関数を実装する中間クラス (抽象クラス) を提供できることです。もう 1 つは、これらの中間クラスの使用方法を知ることです。この作業は、いくつかのプロシージャと関数のパラメータの定義に反映されています。
もう 1 つの非常に重要な点として、オブジェクト指向プログラミングの時代では、クラスの枠組みがプログラムの枠組みを大きく決定し、ソフトウェア開発の成否を決定するということを皆さんに思い出していただきたいと思います。明確で階層的なクラス アーキテクチャにより、機能の分割と拡張が容易になるだけでなく、コードのメンテナンスも容易になります。このうち、継承やポリモーフィズムの考え方を応用し、抽象クラスを導入したり、中間クラスを導入したりする方法がより好ましい。
以下に、Delphi で提供される抽象クラスと具象クラスの一部をリストします。
抽象クラスから派生した具体クラス
TStream TFileStream、TMemoryStream;
TCustomIniFile TIniFile、TMemIniFile、TRegistryIniFile;
TStrings TStringList、TMemoStrings、TListBoxStrings;
他にもたくさんありますが、あなたと私が発見するのを待っています。ここで最も一般的に使用されるのは TStream ですが、私が最も驚いたのは、その TRegistryIniFile を使用すると、IniFile と同じ方法でレジストリにアクセスできることです。これにより、一連のコードを使用して、レジストリの書き込みと Ini ファイルの書き込みの機能を実装できるようになります。シンプルな技術ですが、その意義は計り知れません。
(未完、続く)
その他の記事