本章通过为多项式设计的自定义类说明用户定义类和面向对象编程。选择这里的类是因为它的简单性,不会不必要地分散对Octave编程函数的讨论。即便如此,在引入Octave面向对象编程的语法和技术之前,对多项式类的目标有一点背景知识是必要的。
多项式类用于表示形式的多项式
a0 + a1 * x + a2 * x^2 + ... + an * x^n
其中a0、a1等是实标量。因此多项式可以用向量表示
a = [a0, a1, a2, ..., an];
这是一个足够的规范,可以开始为多项式类编写构造函数。Octave中的所有面向对象类都必须位于一个目录中,该目录是以“”开头的类的名称@象征例如,多项式类的所有方法都将在@polynomial目录
类的构造函数必须是类本身的名称;在本例中,构造函数位于文件中@polynomial/polynomial.m。理想情况下,即使在没有参数的情况下调用构造函数,它也应该返回一个有效的对象。多项式类的构造函数可能看起来像
## -*- 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 (isa (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 endfunction
请注意,构造函数的返回值必须是的输出class
作用的第一个参数class
函数是aststructure,第二个是类本身的名称。调用类构造函数来创建实例的示例是
p = polynomial ([1, 0, 1]);
方法从类目录中的m文件定义,并且可以具有与任何其他m文件相同的嵌入文档。构造函数的帮助可以通过单独使用构造函数名称来获得,也就是说,对于多项式构造函数help polynomial
将返回帮助字符串。通过使用该方法后面的类目录名,可以将帮助限制到特定的类。例如help @polynomial/polynomial
是显示多项式构造函数的帮助字符串的另一种方式。第二种方法是为类的重载方法和函数获取帮助的唯一方法。
Octave期望函数名的任何地方都可以使用相同的规范机制。例如type @polynomial/disp
将打印的代码disp
方法的多项式类到屏幕,和dbstop @polynomial/disp
将在的第一个可执行行设置断点disp
多项式类的方法。
要检查变量是否属于用户类isobject
和isa
可以使用函数。例如
p = polynomial ([1, 0, 1]); isobject (p) ⇒ 1 isa (p, "polynomial") ⇒ 1
类的可用方法可以显示为methods
作用
(obj)
¶("classname")
¶(…, "-full")
¶mtds =
methods (…)
¶列出对象的公共方法的名称obj或thename类classname.
obj可以是Octave类对象或Java对象。classname可以是Octave类或Java类的名称。
如果可选参数"-full"
然后Octave返回所有方法赋值,其中包括输出类型、方法名称以及输入的数量和类型。
当在没有输出参数的情况下调用时,methods
将方法名称列表打印到屏幕上。否则,输出参数mtds包含字符串元胞数组中的列表。
详见: ismethod, properties, fieldnames.
要查询用户类是否存在特定方法ismethod
可以使用函数。
tf =
ismethod (obj, method)
¶tf =
ismethod (class_name, method)
¶如果字符串为true,则返回truemethod是对象的有效方法obj或属于同类clsname.
对于多项式类,有一种计算其根的方法是有意义的。
function r = roots (p) r = roots (fliplr (p.poly)); endfunction
我们可以检查是否存在roots
-方法,方法调用:
p = polynomial ([1, 0, 1]); ismethod (p, "roots") ⇒ 1
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2