重载Octave函数

时间:2017-10-12 21:27:27

标签: class overloading octave

我对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文档有一个模糊的例子,几乎没有关于如何重载函数的解释。

显然,我正在考虑错误的范式。任何建议或良好的资源将不胜感激。 :)

1 个答案:

答案 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 varargininputParser对象结合使用。

避免超载

由于octave为函数重载提供的最小支持,我建议尽可能避免重载