34.6.3 方法

所有类方法都必须在methods块中定义。本小节末尾介绍了该规则的例外情况。methods块可以具有指定访问权限的附加属性,或者指定这些方法是否为静态方法,即可以在不创建该类对象的情况下调用的方法。

classdef some_class
  methods
    function obj = some_class ()
      disp ("New instance created.");
    endfunction

    function disp (obj)
      disp ("Here is some_class.");
    endfunction
  endmethods

  methods (Access = mode)
    function r = func (obj, r)
      r = 2 * r;
    endfunction
  endmethods

  methods (Static = true)
    function c = circumference (radius)
      c = 2 * pi () .* radius;
    endfunction
  endmethods
endclassdef

类的构造函数在methods块中声明,且必须与类具有相同的名称,并且只有一个输出参数,即该类的一个对象。

也可以重载内置或继承的方法,如上例中的disp函数,来告诉 Octave 如何显示some_class的对象(另请参阅类方法)。

通常,方法定义中的第一个参数始终是调用该方法的对象本身。类方法可以通过将对象作为第一个参数传递给该方法来调用,也可以通过对象名后跟一个点(.)和方法名及后续参数来调用:

>> obj = some_class ();
New instance created.
>> disp (obj);   # both are
>> obj.disp ();  # equal

some_class中,方法func定义在将Access属性设置为modemethods块中,mode是以下之一:

public

这些方法可以从任何地方访问。

private

只能从其他类方法访问这些方法。该类的子类无法访问它们。

protected

只能从其他类方法和该类的子类访问这些方法。

方法的默认访问权限为public

最后,方法circumference在静态methods块中定义,并且可以在不创建some_class对象的情况下使用。这对于不依赖于任何类属性的方法非常有用。类名和静态方法的名称,用句点(.)分隔,来调用该静态方法。与非静态方法相比,即使使用some_class的对象调用,该对象也不会作为第一个参数传递。

>> some_class.circumference (3)
⇒   ans =  18.850
>> obj = some_class ();
New instance created.
>> obj.circumference (3)
⇒   ans =  18.850

此外,类方法可以定义在与类同名且前缀为"@"符号的文件夹中的函数里(另请参阅创建类)。主要的classdef文件也必须存储在此类文件夹中。


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

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