1

使用 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

这是一个简单的示例,其中“Parent”类定义了一个抽象的“Limit”属性,该属性在“SimpleChild”和“ExtendedChild”类中都实现了。“ExtendedChild”类在“SimpleChild”类上封装了一个私有实例,并将访问方法(get/set)转发给私有实例。构造“ExtendedChild”实例失败并显示以下消息:

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

我本来希望“限制”属性是可设置的,因为它是在“父”类中定义的,具有受保护的 SetAccess。如果属性直接在“父”类中实现,我可以使问题消失,但是我不能在“ExtendedChild”类中将其重新定义为依赖,这是构造的重点(接口和实现的分离)。

有人可以告诉我我做错了什么吗?

4

1 回答 1

0

由于 的Limit属性SimpleChildprotected,因此您只能设置其值来自SimpleChild或 的子类SimpleChild,而 的情况并非如此ExtendedChild

我不完全确定您要达到的目标,因此无法真正建议“最佳”方法可能是什么。但我猜想无论你想要什么,拥有set一个属性的方法都不太可能Dependent是实现它的正确方法——你可能想要这样做的原因非常少见。

于 2013-08-06T15:31:36.590 回答