How can I write generalized functions to manipulate private properties?

你离开我真会死。 提交于 2019-12-24 03:59:10

问题


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?


回答1:


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


来源:https://stackoverflow.com/questions/12826792/how-can-i-write-generalized-functions-to-manipulate-private-properties

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!