我怎么能写广义函数来处理私有财产?(How can I write generalized func

2019-09-23 21:49发布

在Matlab中,我想在一个类的私有成员执行某些操作。 我也想对其他类执行此相同任务为好。 显而易见的解决方案是在一个单独的M档,所有的类以执行此任务调用编写一个函数。 然而,在Matlab(见下文)似乎是不可能的。 有另一种方式来做到这一点?

这里的问题是具体为:假设我有与内容之一M档

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

...并与内容的另一个M档

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

实例化后p = PrivateTest ,这两个命令的正常工作(如预期):

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

...但这个命令不即使是相同的代码,只是在不同的M档的工作:

p = p.otherFileWrite(3);

因此,它似乎像上一类的私有属性进行操作必须在同一个M档的定义这些私人性质的classdef任何代码。 另一种可能性是让所有的类都继承与写作方法的类,但Matlab的不允许这样无论是。 在一个M档,我有这样的代码:

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

......而在另一个M档我有这样的代码:

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

然而,实例化后p = PrivateTestInherit; 时,命令p.inheritWrite(4)会导致相同的错误消息作为前:“设置‘PrivateTestInherit’类的‘a’属性是不允许的。”

鉴于这种情况,怎么可能一概而论操纵在Matlab私人性质,或者是有可能的代码?

Answer 1:

这是不可能操纵类之外的私人性质,这就是为什么他们被称为私人。 这种想法称为封装。

你可以解决它在许多方面:

  1. 定义一个包装私有公共财产,并改变它。 (参见下面的代码)
  2. (继承模式)做一个共同的父类,你的其他类继承的功能

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


文章来源: How can I write generalized functions to manipulate private properties?