継承メソッドの変更
スーパークラス メソッドを変更する場合
クラス設計により、サブクラス オブジェクトをスーパークラス メソッドに渡すことができます。そのサブクラス オブジェクトはスーパークラス オブジェクトであるため、スーパークラス メソッドは適切に実行されます。ただし、サブクラスは独自バージョンのスーパークラス メソッドを実装できます。このスーパークラス メソッドは、サブクラス オブジェクトが渡されたときに 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