许多函数和运算符接受两个或多个参数,当使用不同类的对象调用这些函数时,很容易出现混合类型的情况。因此,当函数或运算符接收到混合对象时,需要确定应调用哪个类中的哪个方法,这就涉及优先级问题。为此,可以使用 superiorto 和 inferiorto 函数。
(class_name, …) ¶当从类构造函数中调用时,将当前正在构造的对象标记为优先级高于 class_name。
可以在一次调用中指定多个这样的类。此函数只能从类构造函数中调用。
另请参阅: 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