我试图使用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)(行...)
没有足够的输入参数。
怎么了?
答案 0 :(得分:2)
首先,您不能将somemethod
作为方法和属性。您可以删除该方法并为构造函数中的属性分配函数句柄。
function self = test(number)
self.number = number;
switch self.number
case 1
self.somemethod = @(obj)somemethod1(obj)
%....
end
end
此外,您当前的匿名函数已将对象的两个副本传递给该方法:
obj.method
隐式传递obj
作为第一个输入obj.method(obj)
传递obj
的第二个副本作为第二个输入您希望将对象句柄更新为以下内容,将obj
的单个副本传递给方法。
obj.somemethod = @obj.somemethod3
此外,在使用您的课程时,您必须使用点表示法执行somemethod
,因为它是属性而不是真实的&#34;方法
S = test()
S.somemethod()