覆盖MATLAB中的超类方法和访问修饰符

时间:2012-11-19 11:17:58

标签: oop matlab inheritance override access-modifiers

考虑以下简单的类层次结构:

A.M

classdef A < handle
    methods (Access = protected)    %# protected vs. private
        function foo(obj)
            disp('class A')
        end
    end
end

B.m

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)

1 个答案:

答案 0 :(得分:10)

这似乎是Matlab的限制。我已经尝试了所有属性组合。每当属性不同时,Matlab就会抛出错误,除非A的方法是私有的,在这种情况下B中的属性无关紧要。

enter image description here

换句话说,除非A中的方法是私有的,否则A和B中方法的属性必须相同。我想这在某种程度上是有意义的,因为TMW说“如果一个方法对于子类是可见的,那么属性必须是相同的;如果一个方法对于子类是不可见的,那么子类可以做任何他们喜欢的事情”。