34.4.3对象的优先顺序

许多函数和运算符都有两个或多个参数,当用不同类的对象调用这些函数时,可能会出现这种情况。因此,当有混合对象给定给函数或运算符时,有必要确定从哪个类调用哪个方法的优先级。为此superiortoinferiorto可以使用的函数

 
: superiorto (class_name, …)

从类构造函数调用时,将当前构造的对象符号为优先级高于class_name.

在一个调用中可以指定多个这样的类。此函数可能只有从类构造函数调用。

详见: inferiorto.

广告
 
: inferiorto (class_name, …)

从类构造函数调用时,将当前构造的对象符号为优先级低于class_name.

在一个调用中可以指定多个这样的类。此函数可能只有从类构造函数调用。

详见: 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"类实际上并不是必需的。

当遇到两个优先级相等的对象时,Octave将使用参数列表中第一个出现的对象的方法。


版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2