主要内容

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

継承メソッドの変更

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

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

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

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

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

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

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

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

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

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

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

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

classdef子<超级方法函数foo (obj)%预处理步骤...foo@Super (obj);%后处理步骤...结束结束结束

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

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

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

classdef超级方法(密封)函数foo (obj) step1 (obj)%叫step1步骤2 (obj)%调用步骤2步骤3 (obj)%调用步骤3结束结束方法(访问=保护)函数step1 (obj)%超类版本结束函数步骤2 (obj)%超类版本结束函数步骤3 (obj)%超类版本结束结束结束

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

classdef子<超级...方法(访问=保护)函数step1 (obj)%子类版本结束函数步骤2 (obj)%子类版本结束函数步骤3 (obj)%子类版本结束...结束结束

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

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

classdef超级方法函数foo (obj)%父类的实现结束结束结束
classdef子<超级方法函数foo (obj)%子类实现结束结束结束

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

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

classdef超级方法(抽象)foo (obj)抽象方法没有实现结束结束结束
classdef子<超级方法函数foo (obj)%具体方法的子类实现结束结束结束

関連するトピック