11

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

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

BM

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)
4

1 回答 1

11

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

在此处输入图像描述

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

于 2012-11-19T12:59:35.510 回答