我可以用MATLAB使用一个自定义复制方法创建数组时我类?

2视图(30天)
我有一个问题与一个类属性处理类。我创建了这个示例来演示这个问题:
classdefProblem_Class <处理
属性(SetObservable = true)
Prop1
结束
方法
函数s = Problem_Class
年代。Prop1 = Prop1_Class;
结束
结束
结束
classdefProp1_Class <处理
属性(SetObservable = true)
Prop2
结束
方法
函数s = Prop1_Class
年代。Prop2 = Prop2_Class;
结束
结束
结束
classdefProp2_Class <处理
属性(SetObservable = true)
的名字(:1)字符
结束
方法
函数s = Prop2_Class
年代。Name =;
结束
结束
结束
如果我创建一个实例 Problem_Class :
问题= Problem_Class
现在的问题如果我创建一个数组 Prop1 ,例如:
problem.Prop1.Prop2。Name =“指数1”;
problem.Prop1 .Prop2 (8)。Name =“指数8”;
problem.Prop1 .Prop2 (7)。Name =“指数7”;
如果我们看一下 . name 属性为每个 problem.Prop1.Prop2 ,我希望看到这个:
[problem.Prop1.Prop2];{ans.Name}’
{'指数1 '}
{1×0字符}
{1×0字符}
{1×0字符}
{1×0字符}
{1×0字符}
{'指数7 '}
{'指数8 '}
但我得到这个
{'指数1 '}
{'指数7 '}
{'指数7 '}
{'指数7 '}
{'指数7 '}
{'指数7 '}
{'指数7 '}
{'指数8 '}
这是发生的原因是在这里解释道: //www.tianjin-qmedu.com/help/matlab/matlab_oop/initializing-arrays-of-handle-objects.html, 在陈述(最后)”结果在两个调用类的构造函数。第一个创建对象数组元素 (4、5) 。第二个创建一个默认的对象,MATLAB拷贝所有剩余的空数组元素。”
所以,当我电话 problem.Prop1 .Prop2 (8)。Name = '指数8 '; MATLAB调用 Prop1_Class 构造函数一次,来填充 problem.Prop1 (8) 第二次,然后创建一个 Prop1_Class 对象,副本 problem.Prop1 (7) 。所以现在 problem.Prop1 (7) 都指向同一个对象在内存中。我不想要这个!我需要 problem.Prop1 (7) 是唯一的元素,我需要这个隐式地而不必pre-initialise发生 problem.Prop1 () 数组中。
我以为我已经找到了解决方案: //www.tianjin-qmedu.com/help/matlab/matlab_oop/custom-copy-behavior.html, 我创建了一个类的基础上 HandleCopy 在该页面示例, Problem_Class , Prop1_Class , Prop2_Class 所有继承,所以他们应该自定义复制行为。我已经核实,如。 (b) =副本 ,“ b ”的一个实例 Prop1_Class ,然后按预期的行为,创造一个独立的副本 b 一个 (这样 ~ = b ,但他们的属性具有相同的值)。然而,MATLAB似乎并不时调用自定义复制方法创建一个数组!
回到前面的示例:当我打电话 problem.Prop1 .Prop2 (8)。Name = '指数8 '; 一旦MATLAB已经创建了 problem.Prop1 (8) 第二个元素,然后创建 Prop1_Class 对象和“副本” problem.Prop1 (7) ,我怎样到MATLAB使用一个自定义的复制功能,所以我可以防止所有 problem.Prop1 (7) 指向同一个对象?
感谢阅读这篇文章,所有的帮助感激地接受!
2的评论
哈利波特小说
哈利波特小说 2020年6月26日
你好彼得,谢谢你的输入。是的,我需要处理一切,因为我需要使用 (SetObservable = true) 这仅适用于处理。
如果我理解正确的话,在你上面的例子你有工作,我想要的,但通过 Prop2_Class 一个值类,而不是处理类。但你有 (SetObservable = true) 类属性的值,这是为你工作?这个改变在最近的版本中(我2018)?

登录置评。

接受的答案

埃米尔哈姆萨
埃米尔哈姆萨 2020年6月26日
似乎subsasgn () //www.tianjin-qmedu.com/help/matlab/ref/subsasgn.html 在这种情况下可能会有帮助。你可以控制任务的行为。下面的代码显示了一个非常粗糙的例子。你可以根据你的要求调整和改进
classdefProblem_Class <处理
属性(SetObservable = true)
Prop1
结束
方法
函数s = Problem_Class
年代。Prop1 = Prop1_Class;
结束
函数= subsasgn (S B)
n = S (2) .subs {:};
m =元素个数(A.Prop1);
num_new_elem = n - m;
如果num_new_elem > 1
我= 1:num_new_elem-1
.Prop2 A.Prop1 (m + i)。Name =;
结束
A.Prop1 .Prop2 (m + num_new_elem)。Name = B;
其他的
A.Prop1 .Prop2 (n)。Name = B;
结束
结束
结束
结束
例子
问题= Problem_Class;
problem.Prop1 (1) .Prop2。Name =“指数1”;%的当前定义subsasgn需要使用索引(1)第一个元素
problem.Prop1 .Prop2 (8)。Name =“指数8”;
problem.Prop1 .Prop2 (5)。Name =“指数7”;
x = [problem.Prop1.Prop2];
{x.Name}’
输出
ans =
8×1细胞数组
{“指数1”}
{1×0字符}
{1×0字符}
{1×0字符}
{“指数7”}
{1×0字符}
{1×0字符}
{“指数8”}
2的评论
埃米尔哈姆萨
埃米尔哈姆萨 2020年6月26日
是的,我的回答中的示例非常粗糙。一般情况下,可能需要考虑其他事情。希望在将来发布的版本中解决方案将被添加。

登录置评。

更多的答案(0)

类别

找到更多的在数据类型识别帮助中心文件交换

s manbetx 845


释放

R2018a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!