2

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

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

4

1 回答 1

0

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

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

  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
于 2012-10-10T19:35:53.573 回答