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})
## 创建一个多项式对象,表示多项式
##
## @example
## a0 + a1 * x + a2 * x^2 + @dots{} + an * x^n
## @end example
##
## @noindent
## 从系数向量 [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(:).';  # 强制转换为行向量
      p = class (p, "polynomial");
    else
      error ("@polynomial: A must be a real vector");
    endif
  endif

  superiorto ("double");

endfunction

请注意,用户类始终具有比 Octave 内置类型更高的优先级。因此,将多项式类标记为高于 "double" 类实际上并非必需。

当遇到两个优先级相等的对象时,Octave 将使用参数列表中排在前面的对象的方法。


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

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