我正处于一个更大项目的开端,我必须重写现有的MATLAB脚本代码。我被要求使用MATLAB的面向对象编程支持来获得更灵活和更健壮的程序。 我得到了一个观点,我想知道如何让不同子类的对象进行通信或更好:什么是最好或最优雅/最有效/用户友好的方式。
例:
超类A(句柄类):
classdef A < handle
properties
myvar
end
methods (Access = protected)
function calc_myvar(obj)
%calculate myvar with some code
obj.myvar=...;
end
end
end
B小组:
classdef B < A
properties
subclassvar
end
methods (Access = protected)
function calc_subclassvar(obj)
%calculate subclassvar with some code
%needs myvar of an object of class C
%C.myvar
obj.subclassvar=...;
end
end
end
子类C:
classdef C < A
properties
%some other properties
end
methods
%some other methods
end
end
因此,子类B需要在A中定义的子类C的变量。此时我总是将C的对象作为附加输入参数传递给函数。另外我不知道C.myvar是否已经有了价值 目前的实施:
function calc_subclassvar(obj,C)
if isempty(C.myvar)
C.calc_myvar;
end
obj.subclassvar = do_something_with_C.myvar;
end
还有另一种更好的方法吗?我读过重载get
函数,所以我不必每次检查变量是否存在?我读到了有关事件和听众的信息,却无法令人满意地工作。例如,如果我想向C添加一个监听器,它必须知道从哪个特定对象发送事件。或者有没有办法让C只听A的任何对象?
也许你知道另一种方式。这有点令人困惑。 =)
答案 0 :(得分:1)
我认为你有点过于复杂化这个问题。不管怎样,或者我不完全理解你的要求。
首先,您没有使用任何构造函数。我通常会使用它们在实例时传递给定类中所需对象的引用。其次,你写的是你不知道C是否已经在B中需要时被初始化了。我认为你的程序缺乏结构,所以如果你的重组任务的一部分是为了使程序更健壮,这将是一个很好的起点。除非你有充分的理由反对它,否则你应该能够告诉不同对象的初始化顺序。如上所述使用构造函数会强制您考虑这一点,因为在示例中没有实例B的实例C不能。
以下是我的B和C版本。我排除了A,因为继承的需要并不是真正关心这个问题。
C类:
classdef C < handle
properties
some_const = pi;
end
methods
%some other methods
end
end
B组:
classdef B < handle
properties
C_handle
end
methods (Access = public)
function obj = B(C_handle)
obj.C_handle = C_handle;
end
function disp_c_var(obj)
disp(obj.C_handle.some_const)
end
end
end
使用课程:
c_inst = C();
b_inst = B(c_inst);
b_inst.disp_c_var();
现在,b_inst的所有后续使用都已经引用了c_inst,因此不必再次传递。