在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中概括操作私有属性的代码,或者是否可能?
答案 0 :(得分:0)
不可能在类之外操纵私有属性,这就是为什么它们被称为私有属性。这个想法叫做封装。
你可以通过多种方式解决它:
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