如何编写通用函数来操作私有属性?

时间:2012-10-10 19:23:51

标签: oop matlab properties private

在Matlab中,我想对一个类的私有成员执行一些操作。我也想在其他类上执行完全相同的任务。显而易见的解决方案是在一个单独的M文件中编写一个函数,所有类都调用该文件来执行此任务。但是,这在Matlab中似乎是不可能的(见下文)。还有另一种方法可以实现这个目标吗?

具体问题是:假设我有一个包含内容的文件

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);

因此,似乎任何对类的私有属性执行操作的代码必须与定义这些私有属性的classdef位于同一m文件中。另一种可能性是让所有类都使用write方法继承一个类,但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中概括操作私有属性的代码,或者是否可能?

1 个答案:

答案 0 :(得分:0)

不可能在类之外操纵私有属性,这就是为什么它们被称为私有属性。这个想法叫做封装。

你可以通过多种方式解决它:

  1. 定义包装私有的公共属性,并进行更改。 (见下面的代码)
  2. (继承模式)执行公共父类,其他类继承函数

  3. 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