MATLAB OOP:不同子类的对象之间的通信

时间:2013-01-18 10:38:33

标签: oop class matlab communication

我正处于一个更大项目的开端,我必须重写现有的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的任何对象? 也许你知道另一种方式。这有点令人困惑。 =)

1 个答案:

答案 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,因此不必再次传递。