次の単純なクラス階層について考えてみます。
午前
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)