Matlab:当实现在超类中声明为抽象的方法时,为什么必须公开访问?

时间:2018-09-12 21:04:18

标签: matlab oop inheritance

在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”。

2 个答案:

答案 0 :(得分:1)

它们不必是公共的,但必须由子类和超类访问,并且由于错误,它们必须相同。因此,您有2个问题:

  1. 您的超类的方法是公共的,而您的子类的方法是私有的
  2. 您不能仅将超类的方法设置为private,否则子类将无法看到它。

您要设置Access = protected,这意味着只有超类和子类才具有该功能的可见性,因此具有相同的访问权限,可以指定其自己的行为,并且该功能对于其他对象是隐藏的。

以下是Access选项,其中的定义来自documentation

  • public-无限制访问
  • 受保护的-从类或子类
  • 中的方法进行访问
  • private-仅通过类方法访问(不能从子类访问)

因此您的课程变成:

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

换句话说,通过将方法funpublic更改为private,客户端将无法使用sub的实例,就好像它是{的实例{1}}。