0

我正处于一个更大项目的开始,我必须重写现有的 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 添加一个侦听器,它必须知道事件是从 A 的哪个特定对象发送的。或者有没有办法让 C 只监听 A 的任何对象?
也许你知道另一种方式。这有点令人困惑。=)

4

1 回答 1

1

我认为您将问题复杂化了一点。要么,要么我不完全理解你的要求。

首先,您没有使用任何构造函数。我通常会使用它们在实例时传递对给定类中所需对象的引用。其次,您写道,当您在 B 中需要它时,您不知道 C 是否已被初始化。我认为这是您的程序缺乏结构,所以如果您的重组任务的一部分是使程序更健壮,这将是一个很好的起点。除非您有充分的理由反对它,否则您应该能够分辨出不同对象的初始化顺序。使用上述构造函数会迫使您考虑这一点,因为在您的示例中,如果没有 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,因此不必再次传递它。

于 2013-01-18T16:35:32.523 回答