使用Matlab R2012a,我有以下类层次结构:
classdef Parent < handle
properties (Abstract, SetAccess = protected)
Limit
end
end
classdef SimpleChild < Parent
properties (SetAccess = protected)
Limit = 1.0
end
end
classdef ExtendedChild < Parent
properties (Access = private)
Child = SimpleChild
end
properties (Dependent, SetAccess = protected)
Limit
end
methods
function this = ExtendedChild
this.Limit = 2;
end
function output = get.Limit(this)
output = this.Child.Limit;
end
function set.Limit(this,input)
this.Child.Limit = input;
end
end
end
这是一个简单的例子,其中&#34;父母&#34; class定义了一个抽象&#34;限制&#34;属性,在&#34; SimpleChild&#34;中实现。和#34; ExtendedChild&#34;类。 &#34; ExtendedChild&#34; class将一个私有实例封装在&#34; SimpleChild&#34;将访问方法(get / set)转发并转发给私有实例。构建一个&#34; ExtendedChild&#34;实例失败,并显示以下消息:
>> obj = ExtendedChild
Setting the 'Limit' property of the 'SimpleChild' class is not allowed.
Error in ExtendedChild/set.Limit (line 16)
this.Child.Limit = input;
Error in ExtendedChild (line 10)
this.Limit = 2;
我原本期望&#34;限制&#34;属性是可设置的,因为它是在&#34; Parent&#34;中定义的。具有受保护的SetAccess的类。如果属性直接在&#34; Parent&#34;中实现,我可以使问题消失。 class,但是我不能将它重新定义为依赖于&#34; ExtendedChild&#34; class,这是构造的重点(界面和实现的分离)。
有人可以告诉我,我做错了吗?
答案 0 :(得分:0)
由于Limit
的{{1}}属性为SimpleChild
,因此您只能从protected
或SimpleChild
的子类设置其值,而不是SimpleChild
ExtendedChild
的案例。
我不完全确定你想要达到的目标,所以不能真正建议“最好”的方法是什么。但我猜想无论你想要什么,对于set
属性使用Dependent
方法都不太可能是实现它的正确方法 - 只有非常罕见的原因可能你想要这样做。