34.4.3 Precedence of Objects

Last-modified: 2025-03-09 (日) 08:46:08

34.4.3 オブジェクトの優先順位

多くの関数や演算子は2つ以上の引数を取り、これらの関数が異なるクラスのオブジェクトで呼び出される状況が容易に発生します。したがって、関数や演算子に複数のオブジェクトが渡された場合、どのクラスのどのメソッドを呼び出すかの優先順位を決定する必要があります。これを行うには、関数superiortoとinferiorto関数を使用します。

: superiorto (class_name, …)
クラス コンストラクターから呼び出された場合、現在構築されているオブジェクトをclass_nameよりも優先順位が高いものとしてマークします。

1 回の呼び出しで複数のクラスを指定できます。この関数はクラス コンストラクターからのみ呼び出すことができます。

See also: inferiorto.

: inferiorto (class_name, …)
クラス コンストラクターから呼び出された場合、現在構築されているオブジェクトをclass_nameよりも優先順位が低いものとしてマークします。

1 回の呼び出しで複数のクラスを指定できます。この関数はクラス コンストラクターからのみ呼び出すことができます。

See also: superiorto.

多項式クラスでは、次のケースを考える。

2 * polynomial ([1, 0, 1]);

これは、クラスのオブジェクト"double"とクラスのオブジェクトを 混合します"polynomial"。この場合、戻り値の型は である必要があり "polynomial"、superiorto関数はクラスコンストラクタで使用されます。特に、多項式クラスコンストラクタは次のように変更されます。

## -*- texinfo -*-
## @deftypefn  {} {} polynomial ()
## @deftypefnx {} {} polynomial (@var{a})
## Create a polynomial object representing the polynomial
##
## @example
## a0 + a1 * x + a2 * x^2 + @dots{} + an * x^n
## @end example
##
## @noindent
## from a vector of coefficients [a0 a1 a2 @dots{} an].
## @end deftypefn
function p = polynomial (a)
 if (nargin == 0)
   p.poly = [0];
   p = class (p, "polynomial");
 else
   if (strcmp (class (a), "polynomial"))
     p = a;
   elseif (isreal (a) && isvector (a))
     p.poly = a(:).';  # force row vector
     p = class (p, "polynomial");
   else
     error ("@polynomial: A must be a real vector");
   endif
 endif
 superiorto ("double");
endfunction

ユーザ クラスは常に組み込み Octave 型よりも優先順位が高いことに注意してください。したがって、多項式クラスを "double"クラスよりも高いものとしてマークすることは実際には必要ありません。

優先順位が同じ 2 つのオブジェクトに直面した場合、Octave は引数リストの最初に表示されるオブジェクトのメソッドを使用します。