考虑以下简单的类层次结构:
classdef A < handle
methods (Access = protected) %# protected vs. private
function foo(obj)
disp('class A')
end
end
end
classdef B < A
methods (Access = public)
function foo(obj)
disp('class B')
end
end
end
B类继承自A类,并且应该将受保护的foo
方法覆盖为公共。
如果我们尝试实例化派生类,我们会收到以下错误:
>> b=B();
Error using B
Method 'foo' in class 'B' uses different access permissions than its superclass 'A'.
奇怪的是,如果foo
被定义为超类A
中的私有方法,那么当我们调用重写方法时,代码就可以正常工作:
>> clear classes
>> b=B(); b.foo()
class B
这是MATLAB OOP实现中的限制/错误,还是这个行为背后有充分的理由? (代码在R2012b上测试)
作为比较,在Java中,规则声明您不能降低子类中方法的可见性,但您可以增加它,其中:
(weakest) private < package < protected < public (strongest)
答案 0 :(得分:10)
这似乎是Matlab的限制。我已经尝试了所有属性组合。每当属性不同时,Matlab就会抛出错误,除非A的方法是私有的,在这种情况下B中的属性无关紧要。
换句话说,除非A中的方法是私有的,否则A和B中方法的属性必须相同。我想这在某种程度上是有意义的,因为TMW说“如果一个方法对于子类是可见的,那么属性必须是相同的;如果一个方法对于子类是不可见的,那么子类可以做任何他们喜欢的事情”。