npt-japanese

% 7.6.6.2. Standard Method-Combination

UP


7.6.6.2. Standard Method-Combination

method-combinationのstandardは、standard-generic-functionクラスによって提供されます。 これはmethod-combinationのタイプが指定されなかった場合か、 あるいは組み込みのmethod-combinationタイプであるstandardが指定された場合に使われます。

プライマリメソッドは有効なメソッドのメインとなる動作として定義されます。 補助メソッドは3つあるうちの1つの方法を用いて動作を変更します。 プライマリメソッドは修飾子を持ちません。

補助メソッドは、修飾子:before, :after, そして:aroundのメソッドです。 method-combinationのstandardは、メソッドに対して2つ以上の修飾子を許容しません。 もしメソッド定義で複数の修飾子をもつメソッドを定義した場合は、エラーが発せられます。

method-combinationのstandardの意味を次に示します。

method-combinationのstandardでは、適用可能なメソッドが存在しても、 適用可能なプライマリメソッドが存在しなかった場合はエラーが発せられます。

beforeメソッドはmost-specific-first順にて実行され、 afterメソッドはleast-specific-first順に実行されます。 この設計の違いの根拠を、例として次のように示します。 クラスC1がスーパークラスであるC2の動作を、 beforeメソッドとafterメソッドに追加することで変更することを考えます。 クラスC2の振る舞いがC2のメソッドとして直接定義するか、 あるいはスーパクラスを継承によるものかに関わらず、 クラスC1のインスタンスによって呼び出されるメソッドの相対的な順番には影響しません。 クラスC1beforeメソッドは、クラスC2の全てのメソッドの前に実行されます。 クラスC1afterメソッドは、クラスC2の全てのメソッドの後に実行されます。

対称的に、全てのaroundメソッドが実行されるのは、他のメソッドが実行される前です。 このように最も遠いaroundメソッドは、最も特定的なプライマリメソッドの前に実行されます。

もしプライマリメソッドのみが宣言されており、 さらにcall-next-methodが使用されなかった場合は、 最も特定的なメソッドのみが実行されます。 つまり最も特定的なメソッドが他の一般的なメソッドをシャドウしたということです。


TOP, Github