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 に答える