所有类方法都必须在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属性设置为mode的methods块中,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