ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

抽象クラス

抽象クラス

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

 抽象クラスの用語

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

具象サブクラスの実装

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

MATLAB® は、同じシグネチャまたは属性をもつ具象メソッドの実装をサブクラスに強制しません。

抽象クラス:

  • 抽象でないプロパティおよびメソッドを定義できる

  • 具象メンバーを継承によって渡す

  • 抽象メンバーを定義する必要がない

抽象クラスの宣言

次を宣言するクラスは抽象クラスです。

  • Abstract クラス属性

  • 抽象メソッド

  • 抽象プロパティ

抽象クラスのサブクラスが、継承したすべての抽象メソッドまたはプロパティに対して具象実装を定義しない場合は、そのサブクラスも抽象となります。

抽象クラス

classdef ステートメントでクラスを抽象クラスとして宣言します。

classdef (Abstract) AbsClass 
   ...
end

Abstract クラスの属性を宣言するクラスの場合、以下のようになります。

  • 具象サブクラスは、抽象として宣言されているプロパティやメソッドをすべて再定義しなければなりません。

  • 抽象クラスは、抽象メソッドまたはプロパティを定義する必要はありません。

抽象メソッドまたはプロパティを定義する際は、MATLAB は自動的に Abstract クラスの属性を true に設定します。

抽象メソッド

次のように抽象メソッドを定義します。

methods (Abstract)
   abstMethod(obj)
end

Abstract メソッドの属性を宣言するメソッドの場合、以下のようになります。

  • 抽象メソッドを定義するには、function...end ブロックを使用せず、メソッド シグネチャのみを使用します。

  • 抽象メソッドは、抽象クラスに実装をもちません。

  • 具象サブクラスは、同じ数の入力引数と出力引数をサポートする必要はありません。さらに、同じ引数名を使用する必要もありません。ただし、一般にサブクラスは、サブクラス メソッドを実装する場合に、同じシグネチャを使用します。

抽象プロパティ

次のように抽象プロパティを定義します。

properties (Abstract)
   AbsProp
end

Abstract プロパティの属性を宣言するプロパティの場合、以下のようになります。

  • 具象サブクラスは、Abstract 属性をもたない抽象プロパティを再定義しなければなりません。

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

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

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

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

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

classdef AbsClass
   methods(Abstract)
      result = absMethodOne(obj)
      output = absMethodTwo(obj)
   end
end

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

mc = ?AbsClass;
if ~mc.Abstract
   % not an abstract class
end

抽象メンバー名の表示

関数 meta.abstractDetails を使用して抽象プロパティまたはメソッドの名前と定義クラスの名前を表示します。

meta.abstractDetails('AbsClass');
Abstract methods for class AbsClass:
   absMethodTwo   % defined in AbsClass
   absMethodOne   % defined in AbsClass

継承された抽象プロパティおよびメソッドの検索

関数 meta.abstractDetails は、サブクラスでまだ実装されていない任意の継承された抽象プロパティまたはメソッドについて、それらの名前と定義クラスを返します。サブクラスを具象にし、そのサブクラスでどのような抽象メンバーを継承するかを決定しなければならない場合に、この関数を使用します。

たとえば、前の節で定義された AbsClass クラスのサブクラスを作成するとします。この例では、サブクラスは AbsClass によって定義された抽象メソッドの 1 つのみを実装します。

classdef SubAbsClass < AbsClass
% Does not implement absMethodOne
% defined as abstract in AbsClass
   methods
      function out = absMethodTwo(obj)
         ...
      end
   end
end

meta.abstractDetails を使用して、継承したクラス メンバーがすべて実装されているかどうか判定します。

meta.abstractDetails(?SubAbsClass)
Abstract methods for class SubAbsClass:
   absMethodOne   % defined in AbsClass

SubAbsClass クラスは、AbsClass で定義された absMethodOne メソッドを実装していないため、抽象クラスになります。

msub = ?SubAbsClass;
msub.Abstract
ans =

     1

AbsClass で定義された両方のメソッドを実装する場合、サブクラスは具象になります。

関連するトピック