クラスの MATLAB での役割
クラス
MATLAB® 言語では、値はクラスに割り当てられています。たとえば、代入ステートメントを使用して変数を作成すると、適切なクラスの変数が作成されます。
a = 7; b = 'some text'; s.Name = 'Nancy'; s.Age = 64; whos
whos Name Size Bytes Class Attributes a 1x1 8 double b 1x9 18 char s 1x1 370 struct
基本的なコマンドである whos
は、ワークスペース内の各値のクラスを表示します。この情報は、ある値は文字列でテキストとして表示され、別の値は倍精度数であるといった事柄を MATLAB ユーザーが認識するために役立ちます。構造体のような一部の変数は、異なるクラスの値を含むことができます。
事前定義されたクラス
MATLAB では、その言語で使用される基本型からなる基本クラスが定義されています。これらのクラスには数値、logical
、char
、cell
、struct
、および関数ハンドルが含まれます。
ユーザー定義クラス
ユーザー独自の MATLAB クラスを作成できます。たとえば、多項式を表すクラスを定義できます。このクラスは、加算、減算、インデックス付け、コマンド ウィンドウでの表示など、MATLAB クラスに関する演算を定義できます。こうした演算には、多項式加算や多項式減算などと等価の演算を実行することが求められます。たとえば、次のように 2 つの多項式オブジェクトを加算する場合、
p1 + p2
plus
演算は、多項式クラスがこの演算を定義しているため、多項式オブジェクトを加算できなければなりません。
クラスを定義する際は、特殊な MATLAB 関数をオーバーロードすることができます (たとえば、加算演算子に対して plus.m
など)。MATLAB は、それらの演算がユーザー クラスのオブジェクトに適用される際に、これらのメソッドを呼び出します。
そのようなクラスを作成する例は、クラスによる多項式の表現を参照してください。
MATLAB クラス — 重要な用語
MATLAB クラスは、クラス定義と関連する概念のさまざまな役割を説明する以下の用語を使用します。
クラス定義 — クラスの各インスタンスに共通する記述
プロパティ — クラスのインスタンスのためのデータの保存
メソッド — 通常、そのクラスのインスタンスにのみ実行される操作を実装する特別な関数
イベント — クラスによって定義され、何らかの特定アクションが起こるとクラスのインスタンスによってブロードキャストされるメッセージ
属性 — プロパティ、メソッド、イベント、クラスの動作を変更する値
リスナー — イベント通知がブロードキャストされるときに、コールバック関数を実行することによって特定のイベントに応答するオブジェクト
オブジェクト — クラスのインスタンス。インスタンスは、オブジェクトのプロパティに保存される実際のデータ値を含みます。
サブクラス — 他のクラスから派生するクラスであり、派生元のクラスのメソッド、プロパティ、イベントを継承します (サブクラスは、派生元のスーパークラスで定義されたコードの再利用を容易にします)。
スーパークラス — より具体的に定義されるクラス (サブクラス) を作成するための基礎として使用されるクラス
名前空間 — クラスと関数の命名スコープを定義するフォルダー
いくつかの基本的な関係
この節では、MATLAB クラスが使用する基本的な概念をいくつか説明します。
クラス
クラスは、クラスのすべてのインスタンスが共有する、ある特性を指定する定義であるといえます。これらの特性は、クラスを定義する、プロパティ、メソッド、イベントと、これらのクラスの各コンポーネントの動作を変更する属性の値によって決められます。クラス定義は、クラスのオブジェクトがどのように作成され、破棄されるか、オブジェクトが含むデータは何か、さらに、このデータを取り扱う方法などを説明します。
クラスの階層
既存のクラスから新しいクラスを定義することは、多くの場合意味があります。この方法によって、類似のエンティティを表す新しいクラスで設計と手法が再利用できるようになります。サブクラスを作成することによってこの再利用を達成できます。サブクラスはオブジェクトを定義しますが、これは、スーパークラスで定義されるオブジェクトのサブセットとなります。サブクラスは、そのスーパークラスよりも特定的であり、新しいプロパティ、メソッド、イベントを、スーパークラスから継承したコンポーネントに追加できます。
数学的な集合が、クラス間の関係を説明するのに役立ちます。次の図において、正の整数の集合は整数の集合の部分集合 (サブセット) であり、正数の集合の部分集合です。3 つの集合はいずれも実数の部分集であり、実数は「すべての数」の部分集合です。
正整数の定義では、集合の要素がゼロよりも大きいことをさらに指定する必要があります。正整数は、整数と正数の定義を組み合わせます。結果のサブセットはより特定的になります。そのため、スーパーセットよりも定義が狭くなりますが、スーパーセットを定義するすべての特性を共有します。
"is a" の関係は、既存のスーパーセットに関して特定のサブセットを定義することが適切であるかどうかを判定するのに役立ちます。たとえば、次のステートメントはいずれも意味があります。
正整数は整数です
正整数は正数です
"is a" の関係が成り立つ場合、より一般的な何らかのケースを表すクラスから新しいクラスを定義できる可能性があります。
解の再利用
クラスは、通常、コードの再利用を促す分類法にまとめられます。たとえば、コンピューターのシリアル ポートのインターフェイスを実装するためにクラスを定義する場合、このクラスはおそらく、パラレル ポートのインターフェイスを実装するために設計されたクラスに類似したものとなります。コードを再利用するために、2 種類の端子に共通するものを含むスーパークラスを定義します。次に、スーパークラスからサブクラスを派生します。サブクラスでは、特定の端子それぞれに固有のもののみを実装します。こうすることで、サブクラスはスーパークラスから共通の機能すべてを継承することになります。
オブジェクト
クラスは、クラスの特定的なインスタンスを作成するためのテンプレートのようなものです。このインスタンスまたはオブジェクトは、クラスによって表される特定のエンティティの実際のデータを含みます。たとえば、銀行口座クラスのインスタンスは、実際の口座番号と実質収支を使用して特定の銀行口座を表すオブジェクトです。このオブジェクトは、預金したり、預金残高からの引き出しなど、クラスが定義する操作を実行する機能を組み込みます。
オブジェクトは、単なる受動的なデータ コンテナーではありません。オブジェクトは、ある操作のみが実行されることを許可したり、パブリックである必要のないデータを隠したり、設計で操作対象となっていなかったオブジェクトに対して操作を実行して外部のクライアントがデータを誤って使用することがないようにします。オブジェクトは、このように、含まれたデータを積極的に管理します。オブジェクトは、破棄されたときに起こる事象も制御します。
情報のカプセル化
オブジェクトの重要な点は、オブジェクトの情報が保存された方法、あるいは検索されたときにそれが保存されていたかまたは計算されたかにかかわらず、オブジェクトのプロパティとメソッドによって、オブジェクトに保存された情報にアクセスするソフトウェアを記述できることです。オブジェクトは、メソッドとプロパティの内部的な実装から、オブジェクトにアクセスするコードを分離します。クラスの一部でないメソッドから、データと操作の両方を隠すクラスを定義できます。こうして、利用目的に最適なインターフェイスを実装できます。
参照
[1] Shalloway, A., J. R. Trott, Design Patterns Explained A New Perspective on Object-Oriented Design.. Boston, MA: Addison-Wesley 2002.
[2] Gamma, E., R. Helm, R. Johnson, J. Vlissides, Design Patterns Elements of Reusable Object-Oriented Software. Boston, MA: Addison-Wesley 1995.
[3] Freeman, E., Bert Bates, Kathy Sierra, Elisabeth Robson, Head First Design Patterns. O'Reilly Media, 2004.