是否可以在MATLAB classdef

时间:2016-07-30 15:13:47

标签: matlab

我试图使用MATLAB OOP。我想在类构造函数中更改类方法处理程序。 例如,我有一个类test,其中类方法使用一种方法,具体取决于类属性中的变量number

mytest = test(2);
mytest.somemethod();

classdef test < handle
  properties
    number
  end
  methods        
    function obj = test(number)
      obj.number = number;
    end
    function obj = somemethod(obj)
      switch obj.number
        case 1
          obj.somemethod1();
        case 2
          obj.somemethod2();
        case 3
          obj.somemethod3();
      end
    end
    function obj = somemethod1(obj)
      fprintf('1')
    end
    function obj = somemethod2(obj)
      fprintf('2')
    end
    function obj = somemethod3(obj)
      fprintf('3')
    end
  end
end

只要调用switch,就会使用test.somemethod()运算符。我是否只能在类构造函数初始化时使用switch一次(即更改方法处理程序),如下所示:

classdef test < handle
  properties
    number
    somemethod %<--
  end
  methods
    % function obj = somemethod(obj,number) % my mistake: I meant the constructor
    function obj = test(number)
      obj.number = number;
      switch number
        case 1
          obj.somemethod = @(obj) obj.somemethod1(obj);
        case 2
          obj.somemethod = @(obj) obj.somemethod2(obj);
        case 3
          obj.somemethod = @(obj) obj.somemethod3(obj);
      end
    end
    function obj = somemethod1(obj)
      fprintf('1')
    end
    function obj = somemethod2(obj)
      fprintf('2')
    end
    function obj = somemethod3(obj)
      fprintf('3')
    end
  end
end

test类的第二个实现不起作用。 对于S = test(2); S.somemethod(),有一个错误: 使用测试错误&gt; @(obj)obj.somemethod2(obj)(行...) 没有足够的输入参数。 怎么了?

1 个答案:

答案 0 :(得分:2)

首先,您不能将somemethod作为方法属性。您可以删除该方法并为构造函数中的属性分配函数句柄。

function self = test(number)
    self.number = number;
    switch self.number
        case 1
            self.somemethod = @(obj)somemethod1(obj)
    %....
    end
end

此外,您当前的匿名函数已将对象的两个副本传递给该方法:

  1. obj.method隐式传递obj作为第一个输入
  2. obj.method(obj)传递obj的第二个副本作为第二个输入
  3. 您希望将对象句柄更新为以下内容,将obj的单个副本传递给方法。

    obj.somemethod = @obj.somemethod3
    

    此外,在使用您的课程时,您必须使用点表示法执行somemethod,因为它是属性而不是真实的&#34;方法

    S = test()
    S.somemethod()