Henning Frechen
Henning Frechen

Reputation: 55

MATLAB OOP: Communication between objects of different subclasses

I am at the beginning of a bigger project, where I have to rewrite existing MATLAB script code. I was asked to use MATLAB's object oriented programming support to get a more flexible and robust program. I got to a point, where I wondered how to let objects of different subclasses communicate or better: what is the best or most elegant/efficient/user friendly way to do that.

Example:
Superclass A (handle class):

classdef A < handle
  properties
    myvar
  end

  methods (Access = protected)
    function calc_myvar(obj)
      %calculate myvar with some code
      obj.myvar=...;
    end
  end
end

Subclass 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

Subclass C:

classdef C < A
  properties
    %some other properties
  end

  methods
    %some other methods
  end
end

So subclass B needs a variable of subclass C that is defined in A. At the moment I always pass an object of C as additional input parameter to the function. Additionally I don't know if C.myvar already has a value.
Current implementation:

function calc_subclassvar(obj,C)
  if isempty(C.myvar)
    C.calc_myvar;
  end
  obj.subclassvar = do_something_with_C.myvar;
end

Is there another, better way? I read of overloading the get function, so I don't have to check everytime if the variable exists? And I read about events and listeners but couldn't get it to work satisfactorily. For example if I want to add a listener to C it has to know from which specific object of A the event is sent. Or is there a way that C just listens for any object of A?
Maybe you know another way. It's kind of confusing. =)

Upvotes: 0

Views: 771

Answers (1)

KlausCPH
KlausCPH

Reputation: 1835

I think you are over complicating the problem a bit. Either that, or I do not completely understand what you are asking for.

First of all, you are not using any constructors. I would normally use those to pass references to objects needed in a given class at instance-time. Secondly, you write that you don't know if C has been initialized when you need it in B. I see that as a lack of structure in your program, so if a part of your restructuring task is to make the program more robust, this would be a good place to start. Unless you have really good reasons against it, you should be able to tell in which order different objects are being initialized. Using constructors as explained above forces you to consider this, as you can't instance C without an instance of B in your example.

Below are my version of B and C. I excluded A as the need for inheritance is not really concerned with this problem.

Class C:

classdef C < handle
   properties
       some_const = pi;

   end

   methods
      %some other methods
   end
end

Class 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

Use of the classes:

c_inst = C();
b_inst = B(c_inst);
b_inst.disp_c_var();

Now, all subsequent uses of b_inst already have a reference to c_inst, so it wont have to be passed again.

Upvotes: 1

Related Questions