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