34.1创建类

本章通过为多项式设计的自定义类说明用户定义类和面向对象编程。选择这里的类是因为它的简单性,不会不必要地分散对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多项式类的方法。

要检查变量是否属于用户类isobjectisa可以使用函数。例如

p = polynomial ([1, 0, 1]);
isobject (p)
  ⇒ 1
isa (p, "polynomial")
  ⇒ 1
 
: tf = isobject (x)

如果返回truex是一个类对象。

详见: class, typeinfo, isa, ismethod, isprop.

广告

类的可用方法可以显示为methods作用

 
: methods (obj)
: methods ("classname")
: methods (…, "-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.

详见: isprop, isobject, isjava, methods.

广告

对于多项式类,有一种计算其根的方法是有意义的。

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