Amr*_*mro 11 oop matlab inheritance overriding access-modifiers
考虑以下简单的类层次结构:
classdef A < handle
methods (Access = protected) %# protected vs. private
function foo(obj)
disp('class A')
end
end
end
Run Code Online (Sandbox Code Playgroud)
classdef B < A
methods (Access = public)
function foo(obj)
disp('class B')
end
end
end
Run Code Online (Sandbox Code Playgroud)
B类继承自A类,并且应该将受保护的foo方法覆盖为public.
如果我们尝试实例化派生类,我们会收到以下错误:
>> b=B();
Error using B
Method 'foo' in class 'B' uses different access permissions than its superclass 'A'.
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果foo在超类中定义为私有方法,则A在调用重写方法时代码工作正常:
>> clear classes
>> b=B(); b.foo()
class B
Run Code Online (Sandbox Code Playgroud)
那么这是MATLAB OOP实现中的限制/错误,还是有这么好的原因呢?(代码在R2012b上测试)
作为比较,在Java中,规则规定您不能降低子类中方法的可见性,但您可以增加它,其中:
(weakest) private < package < protected < public (strongest)
Run Code Online (Sandbox Code Playgroud)
Jon*_*nas 11
这似乎是Matlab的限制.我已经尝试了所有属性组合.只要属性不同,Matlab就会抛出错误,除非A的方法是私有的,在这种情况下,B中的属性无关紧要.

换句话说,除非A中的方法是私有的,否则A和B中方法的属性必须相同.我想这在某种程度上是有意义的,因为TMW说"如果一个方法对于子类是可见的,那么属性必须是相同的;如果一个方法对于子类是不可见的,那么子类可以做任何他们喜欢的事情".
| 归档时间: |
|
| 查看次数: |
4116 次 |
| 最近记录: |