Переопределение методов суперкласса и модификаторов доступа в MATLAB

Рассмотрим следующую простую иерархию классов:

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

Это, по-видимому, является ограничением Matlab. Я пробовал все комбинации атрибутов. Matlab выдает ошибки всякий раз, когда атрибуты разные, за исключением случаев, когда метод A является приватным, и в этом случае атрибуты в B не имеют значения.

enter image description here

Другими словами, если метод в не является приватным, атрибуты метода в и B должны быть одинаковыми. Я предполагаю, что это имеет смысл в некоторой степени, поскольку TMW говорит: "Если метод видим подклассу, атрибуты должны быть одинаковыми, если метод не виден подклассу, подклассы могут делать все, что им нравится".