Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

抽象クラスとクラスメンバー

抽象クラス

抽象クラスは、クラスのグループに共通する機能の記述に有効ですが、各クラス内には固有の実装が必要です。

抽象クラスの用語

抽象クラスは、関連するサブクラスのグループの基礎 (スーパークラス) として機能します。抽象クラスは、サブクラスが実装する抽象プロパティおよびメソッドを定義できます。各サブクラスは、特定の要件をサポートするように具象プロパティおよびメソッドを実装できます。

具象サブクラスの実装

サブクラスが具象クラスになるためには、継承したすべての抽象プロパティおよびメソッドを実装しなければなりません。そうしないと、そのサブクラス自体が抽象クラスとなります。

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属性をもたない抽象プロパティを再定義しなければなりません。

  • 具象サブクラスは、SetAccessGetAccess属性に対し、抽象スーパークラスで使用されるその属性と同じ値を使用しなければなりません。

  • 抽象プロパティは、アクセス メソッドの定義や初期値の指定を行うことはできません。具象プロパティを定義するサブクラスは、アクセス メソッドの作成や初期値の指定を行うことができます。

アクセス メソッドについての詳細は、プロパティ アクセス メソッド参照してください。

クラスが抽象かどうかの判定

クラスが抽象かどうか判定するには、そのクラスのmeta.classオブジェクトのAbstractプロパティをクエリします。たとえば、AbsClassは 2 つの抽象メソッドを定義します。

classdefAbsClassmethods(Abstract) result = absMethodOne(obj) output = absMethodTwo(obj)endend

meta.classAbstractプロパティの論理値を使用して、クラスが抽象かどうか判定します。

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で定義された両方のメソッドを実装する場合、サブクラスは具象になります。

関連するトピック