我对Octave相对较新,只是开始上课。我有一个带有以下形式的构造函数的类:
east_ny_zipcodes = [11209, 11210, 11211, ...].map( n => n.toString() );
现在我想通过重载构造函数来容纳其他参数,所以我尝试使用以下形式:
classdef MyClass < handle
properties
property1
property2
endproperties
methods
function self = MyClass(Param1) % Constructor
self.property1 = Param1;
self.property2 = "SOMEVALUE"
endfunction
endmethods
endclassdef
使用此格式,我收到错误:
classdef MyClass < handle
properties
property1
property2
endproperties
methods
function self = MyClass(Param1) % Constructor
self = self.MyClass(Param1, "SOMEVALUE")
endfunction
function self = MyClass(Param1, Param2) % Constructor
self.property1 = Param1;
self.property2 = Param2;
endfunction
endmethods
endclassdef
我不知道该怎么办。 Octave文档有一个模糊的例子,几乎没有关于如何重载函数的解释。
显然,我正在考虑错误的范式。任何建议或良好的资源将不胜感激。 :)
答案 0 :(得分:1)
要创建重载函数的效果,您必须显式检查参数的数量和类型,并以编程方式对参数的数量和类型做出反应。在八度音程中还没有直接的方法来重载类成员。在您的示例中,您将使用默认参数的八度实现。
这个非常简单的解决方案只检查参数的数量,并将第二个参数设置为默认值(如果不存在)。
classdef myClass < handle
properties
property1
property2
endproperties
methods
function self = myClass(Param1, Param2) % Constructor
if nargin < 2
Param2 = "SOMEVALUE";
endif
self.property1 = Param1;
self.property2 = Param2;
endfunction
endmethods
endclassdef
>> a=myClass(1)
a =
<object myClass>
>> a.property1
ans = 1
>> a.property2
ans = SOMEVALUE
对于更复杂的重载,我建议将variable length argument list varargin
与inputParser
对象结合使用。
由于octave为函数重载提供的最小支持,我建议尽可能避免重载。