Main Content

継承メソッドの変更

スーパークラス メソッドを変更する場合

クラス設計により、サブクラス オブジェクトをスーパークラス メソッドに渡すことができます。そのサブクラス オブジェクトはスーパークラス オブジェクトであるため、スーパークラス メソッドは適切に実行されます。ただし、サブクラスは独自バージョンのスーパークラス メソッドを実装できます。このスーパークラス メソッドは、サブクラス オブジェクトが渡されたときに MATLAB® が呼び出します。

サブクラスは、特化した動作をサブクラスに指定する必要がある場合に、継承メソッドをオーバーライドします (つまり、同じ名前をもつメソッドを実装する)。スーパークラス メソッドをオーバーライドするいくつかのパターンを次に示します。

  • サブクラス メソッド内からスーパークラス メソッドを呼び出すことにより、スーパークラス メソッドを拡張。サブクラス メソッドは、スーパークラス メソッドの呼び出しに加えて、サブクラス固有の処理を実行できます。

  • 保護されたメソッドを使用して、スーパークラス メソッド内の手続きに一連のステップを実装。その後、パブリックなスーパークラス メソッド内から呼び出される保護されたメソッドを再定義して、これらのステップをサブクラス メソッドに再実装します。

  • 同名のメソッドをサブクラスに再定義。ただし、異なる実装を使用して、サブクラス オブジェクトに対して同じ処理を異なる方法で実行します。

  • 抽象スーパークラス メソッドをサブクラスに実装。抽象スーパークラスは実装なしでメソッドを定義でき、実装の指定をサブクラスに依存します。詳細については、インターフェイスのスーパークラスの定義を参照してください。

スーパークラス メソッドをオーバーライドするサブクラス メソッドは、スーパークラス メソッドによって定義されたものと同じ値を Access 属性に定義しなければなりません。

スーパークラス メソッドの拡張

同名のスーパークラス メソッドをサブクラス メソッドから呼び出すと、スーパークラス メソッドに影響を及ぼすことなくサブクラス オブジェクト向けにスーパークラス メソッドを拡張できます。

たとえば、スーパークラスとサブクラスの両方で foo というメソッドを定義するとします。サブクラス メソッドはスーパークラス メソッドを呼び出し、スーパークラス メソッドの呼び出しに加えて他のステップを実行します。サブクラス メソッドは、スーパークラスには含まれない、サブクラスに特化した部分を処理することができます。

たとえば、次のサブクラスは、スーパークラスの foo メソッドを呼び出す foo メソッドを定義します。

classdef Sub < Super
   methods
      function foo(obj)
         % preprocessing steps
          ...
         foo@Super(obj);
         % postprocessing steps
          ...
      end
   end
end

サブクラスでのスーパークラス プロセスの再実装

スーパークラス メソッドは、各ステップでメソッド (通常、Access 属性が protected に設定されているステップ メソッド) を使用して、一連のステップで実行するプロセスを定義できます。このパターン (テンプレート メソッドと呼ばれる) により、サブクラスはプロセスの各ステップに実装する独自バージョンの保護されたメソッドを作成できます。このプロセスはサブクラスに特化されています。

次に、この手法を実装するコードを示します。

classdef Super
   methods (Sealed)
      function foo(obj)
         step1(obj) % Call step1
         step2(obj) % Call step2
         step3(obj) % Call step3
      end
   end
   methods (Access = protected)
      function step1(obj)
         % Superclass version
      end
      function step2(obj)
         % Superclass version
      end
      function step3(obj)
         % Superclass version
      end
   end
end

サブクラスは foo メソッドをオーバーライドしません。代わりに、一連のステップ (step1(obj)step2(obj)step3(obj)) を実行する保護されたメソッドのみをオーバーライドします。この手法では、サブクラスが各ステップの動作を特化できますが、プロセス内のステップの順序を制御することはできません。サブクラスのオブジェクトをスーパークラスの foo メソッドに渡すと、MATLAB がディスパッチング ルールに従って、サブクラスのステップのメソッドを呼び出します。メソッドのディスパッチの詳細については、メソッドの呼び出しを参照してください。

classdef Sub < Super
   ...
   methods (Access = protected)
      function step1(obj)
         % Subclass version
      end
      function step2(obj)
         % Subclass version
      end
      function step3(obj)
         % Subclass version
      end
      ...
   end
end

スーパークラス メソッドの再定義

サブクラス内で、スーパークラス メソッドを完全に再定義できます。この場合、スーパークラスとサブクラスはいずれも同じ名前でメソッドを定義します。ただし、実装は異なっており、サブクラス メソッドがスーパークラス メソッドを呼び出すことはありません。スーパークラスとサブクラスで同じ演算に異なる実装が必要な場合、同名のメソッドの個別バージョンを作成しなければならないことがあります。

classdef Super
   methods
      function foo(obj)
         % Superclass implementation
      end
   end
end
classdef Sub < Super
   methods
      function foo(obj)
         % Subclass implementation
      end
   end
end

サブクラスでの抽象メソッドの実装

抽象メソッドには実装がありません。抽象メソッドを継承するサブクラスは、そのサブクラスを具象クラスにするためにサブクラス固有の実装を指定しなければなりません。詳細については、抽象クラスとクラス メンバーを参照してください。

classdef Super
   methods (Abstract)
      foo(obj)
         % Abstract method without implementation
   end
end
classdef Sub < Super
   methods
      function foo(obj)
         % Subclass implementation of concrete method
      end
   end
end

関連するトピック