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

Amr*_*mro 11 oop matlab inheritance overriding access-modifiers

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

上午

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

BM

classdef B < A
    methods (Access = public)
        function foo(obj)
            disp('class B')
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

B类继承自A类,并且应该将受保护的foo方法覆盖为public.

如果我们尝试实例化派生类,我们会收到以下错误:

>> b=B();
Error using B
Method 'foo' in class 'B' uses different access permissions than its superclass 'A'. 
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果foo在超类中定义为私有方法,则A在调用重写方法时代码工作正常:

>> clear classes
>> b=B(); b.foo()
class B
Run Code Online (Sandbox Code Playgroud)

那么这是MATLAB OOP实现中的限制/错误,还是有这么好的原因呢?(代码在R2012b上测试)


作为比较,在Java中,规则规定您不能降低子类中方法的可见性,但您可以增加它,其中:

(weakest) private < package < protected < public (strongest)
Run Code Online (Sandbox Code Playgroud)

Jon*_*nas 11

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

在此输入图像描述

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