Рассмотрим следующую простую иерархию классов:
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)