抽象クラスとクラス メンバー
抽象クラス
抽象クラスは、クラスのグループに共通する機能の記述に有効ですが、各クラス内には固有の実装が必要です。
抽象クラスは、関連するサブクラスのグループの基礎 (スーパークラス) として機能します。抽象クラスは、サブクラスが実装する抽象プロパティおよびメソッドを定義できます。各サブクラスは、特定の要件をサポートするように具象プロパティおよびメソッドを実装できます。
具象サブクラスの実装
サブクラスが具象クラスになるためには、継承したすべての抽象プロパティおよびメソッドを実装しなければなりません。そうしないと、そのサブクラス自体が抽象クラスとなります。
MATLAB® は、同じシグネチャまたは属性をもつ具象メソッドの実装をサブクラスに強制しません。
抽象クラス:
抽象でないプロパティおよびメソッドを定義できる
具象メンバーを継承によって渡す
抽象メンバーを定義する必要がない
抽象クラスの宣言
次を宣言するクラスは抽象クラスです。
Abstract
クラス属性抽象メソッド
抽象プロパティ
抽象クラスのサブクラスが、継承したすべての抽象メソッドまたはプロパティに対して具象実装を定義しない場合は、そのサブクラスも抽象となります。
抽象クラス
classdef
ステートメントでクラスを抽象クラスとして宣言します。
classdef (Abstract) AbsClass ... end
Abstract
クラスの属性を宣言するクラスの場合、以下のようになります。
具象サブクラスは、抽象として宣言されているプロパティやメソッドをすべて再定義しなければなりません。
抽象クラスは、抽象メソッドまたはプロパティを定義する必要はありません。
抽象メソッドまたはプロパティを定義する際は、MATLAB は自動的に Abstract
クラスの属性を true
に設定します。
抽象メソッド
次のように抽象メソッドを定義します。
methods (Abstract) abstMethod(obj) end
Abstract
メソッドの属性を宣言するメソッドの場合、以下のようになります。
抽象メソッドを定義するには、
function...end
ブロックを使用せず、メソッド シグネチャのみを使用します。抽象メソッドは、抽象クラスに実装をもちません。
具象サブクラスは、同じ数の入力引数と出力引数をサポートする必要はありません。さらに、同じ引数名を使用する必要もありません。ただし、一般にサブクラスは、サブクラス メソッドを実装する場合に、同じシグネチャを使用します。
抽象メソッドでは
arguments
ブロックを定義できません。
抽象プロパティ
次のように抽象プロパティを定義します。
properties (Abstract) AbsProp end
Abstract
プロパティの属性を宣言するプロパティの場合、以下のようになります。
具象サブクラスは、
Abstract
属性をもたない抽象プロパティを再定義しなければなりません。具象サブクラスは、
SetAccess
とGetAccess
属性に対し、抽象スーパークラスで使用されるその属性と同じ値を使用しなければなりません。抽象プロパティは、アクセス メソッドの定義や初期値の指定を行うことはできません。具象プロパティを定義するサブクラスは、アクセス メソッドの作成や初期値の指定を行うことができます。
アクセス メソッドの詳細については、プロパティの get メソッドおよび set メソッドを参照してください。
クラスが抽象かどうかの判定
クラスが抽象かどうかを判定するには、そのクラスの matlab.metadata.Class
オブジェクトの Abstract
プロパティをクエリします。たとえば、AbsClass
は 2 つの抽象メソッドを定義します。
classdef AbsClass methods(Abstract) result = absMethodOne(obj) output = absMethodTwo(obj) end end
matlab.metadata.Class
の Abstract
プロパティの論理値を使用して、クラスが抽象かどうかを判定します。
mc = ?AbsClass; if ~mc.Abstract % not an abstract class end
抽象メンバーの名前の表示
関数 matlab.metadata.abstractDetails
を使用して抽象プロパティまたはメソッドの名前と定義クラスの名前を表示します。
matlab.metadata.abstractDetails('AbsClass');
Abstract methods for class AbsClass: absMethodTwo % defined in AbsClass absMethodOne % defined in AbsClass
継承された抽象プロパティおよびメソッドの検索
関数 matlab.metadata.abstractDetails
は、サブクラスでまだ実装されていない任意の継承された抽象プロパティまたはメソッドについて、それらの名前と定義クラスを返します。サブクラスを具象にし、そのサブクラスでどのような抽象メンバーを継承するかを決定しなければならない場合に、この関数を使用します。
たとえば、前の節で定義された AbsClass
クラスのサブクラスを作成するとします。この例では、サブクラスは AbsClass
によって定義された抽象メソッドの 1 つのみを実装します。
classdef SubAbsClass < AbsClass % Does not implement absMethodOne % defined as abstract in AbsClass methods function out = absMethodTwo(obj) ... end end end
matlab.metadata.abstractDetails
を使用して、継承したクラス メンバーがすべて実装されているかどうかを判定します。
matlab.metadata.abstractDetails(?SubAbsClass)
Abstract methods for class SubAbsClass: absMethodOne % defined in AbsClass
SubAbsClass
クラスは、AbsClass
で定義された absMethodOne
メソッドを実装していないため、抽象クラスになります。
msub = ?SubAbsClass; msub.Abstract
ans = 1
AbsClass
で定義された両方のメソッドを実装する場合、サブクラスは具象になります。