在Matlab(2017a)中,子类不能限制对抽象超类中声明为抽象的继承方法的访问。为什么不允许这样做?一个小例子:
super.m
classdef (Abstract) super
methods (Abstract)
out = fun(obj,in)
end
end
sub.m
classdef sub < super
properties
prop
end
methods (Access='private') %remove the access restriction to run without errors
function out = fun(obj,in)
out = obj.prop * in;
end
end
end
testInheritance.m
instance = sub;
执行testInheritance.m会导致以下错误消息:
在类“ sub”中使用子方法“ fun”的错误使用了不同的访问权限 权限,而不是其超类“ super”。
答案 0 :(得分:1)
它们不必是公共的,但必须由子类和超类访问,并且由于错误,它们必须相同。因此,您有2个问题:
您要设置Access = protected
,这意味着只有超类和子类才具有该功能的可见性,因此具有相同的访问权限,可以指定其自己的行为,并且该功能对于其他对象是隐藏的。
以下是Access
选项,其中的定义来自documentation:
因此您的课程变成:
classdef (Abstract) super
methods (Abstract = true, Access = protected)
out = fun(obj,in)
end
end
classdef sub < super
properties
prop
end
methods (Access = protected)
function out = fun(obj,in)
out = obj.prop * in;
end
end
end
请注意,语法为Access = protected
,而不是您显示的Access = 'protected'
。
答案 1 :(得分:1)
不允许更改在基类中声明为'public'
的方法的访问属性,以使其无法在派生类中进行访问(这是您的代码尝试执行的操作),因为它会违反Liskov Substitution Principle。
换句话说,通过将方法fun
从public
更改为private
,客户端将无法使用sub
的实例,就好像它是{的实例{1}}。