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在中定义methods块设置Access把某事归因于某人mode,是其中之一:

public

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

广告
private

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

广告
protected

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

广告

方法的默认访问权限为public.

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

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

此外,类方法可以定义为文件夹中的函数,该文件夹与前缀为“”的类同名@符号(详见创建类). 主要classdef文件也必须存储在这里的类文件夹中。


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

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