Search code examples
oopmatlabpropertiesprivate

How can I write generalized functions to manipulate private properties?


In Matlab, I would like to perform some operations on private members of a class. I would also like to perform this exact same task on other classes as well. The obvious solution is to write a function in a separate M file that all the classes call in order to perform this task. However, that seems impossible in Matlab (see below). Is there another way to accomplish this?

Here is the problem specifically: suppose I have one m file with the contents

classdef PrivateTest
    properties (Access=private)
        a
    end

    methods
        function this = directWrite(this, v)
            this.a = v;
        end
        function this = sameFileWrite(this, v)
            this = writePrivate(this, v);
        end
        function this = otherFileWrite(this, v)
            this = otherFileWritePrivate(this, v);
        end
        function print(this)
            disp(this.a);
        end
    end
end

function this = writePrivate(this, v)
    this.a = v;
end

...and another m file with the contents

function this = otherFileWritePrivate(this, v)
    this.a = v;
end

After instantiating p = PrivateTest, both of these commands work fine (as expected):

p = p.directWrite(1);
p = p.sameFileWrite(2);

...but this command doesn't work even though it's the same code, just in a different m file:

p = p.otherFileWrite(3);

So, it seems like any code that performs operations on private properties of a class MUST be in the same m file as the classdef that defines those private properties. Another possibility might be to have all the classes inherit a class with the writing method, but Matlab doesn't allow this either. In one m file, I would have this code:

classdef WriteableA
    methods
        function this = inheritWrite(this, v)
            this.a = v;
        end
    end
end

...and in another m file I would have this code:

classdef PrivateTestInherit < WriteableA
    properties (Access=private)
        a
    end
end

However, after instantiating p = PrivateTestInherit;, the command p.inheritWrite(4) causes the same error message as before: "Setting the 'a' property of the 'PrivateTestInherit' class is not allowed."

In light of this, How is it possible to generalize code that manipulates private properties in Matlab, or is it possible?


Solution

  • It is not possible to manipulate private properties outside of the class, that is why they are called private. This idea is called encapsulation.

    You can in solve it in many ways:

    1. Define public property that wraps the private, and change it. (See code below)
    2. (Inheritance pattern) Do a common father class, your other classes inherit the function

    classdef PrivateTest
        properties (Access=private)
            a
        end
    
        properties(Access=public,Dependent)
            A
        end
    
        methods
            function this = set.A(this,val)
                this.a = val;
            end
    
            function val = get.A(this)
               val = this.a;
            end
    
            function this = directWrite(this, v)
                this.a = v;
            end
            function this = sameFileWrite(this, v)
                this = writePrivate(this, v);
            end
            function this = otherFileWrite(this, v)
                this = otherFileWritePrivate(this, v);
            end
            function print(this)
                disp(this.a);
            end
        end
    end
    
    function this = writePrivate(this, v)
        this.A = v;
    end