Matlab:如何限制对抽象类方法子类的访问

Posted

技术标签:

【中文标题】Matlab:如何限制对抽象类方法子类的访问【英文标题】:Matlab: How to restict access to sub-class of abstract class method 【发布时间】:2020-11-26 14:08:50 【问题描述】:

让我们有以下三个类:

% Main class
classdef MjrClass < handle

   properties (SetAccess = immutable, GetAccess = public)
      cls;
   end

   methods (Access = public)
      function self = MjrClass()
         self.cls = SubClass(2);
      end
   end

end
% Abstract class
classdef (Abstract) AbsClass < handle

   properties (SetAccess = immutable, GetAccess = protected)
      p;
   end

   methods (Access = ?MjrClass)
      function self = AbsClass(parent)
         self.p = parent;
         self.do();
      end
   end

   methods (Access = public)
      function show(self)
         fprintf('self.p: %d\nself.c: %d\n', self.p, self.c)
      end
   end

end
% Sub-Class
classdef SubClass < AbsClass

   properties (SetAccess = private, GetAccess = public)
      c;
   end

   methods (Access = private)
      function do(self)
         self.c = self.p*2;
      end
   end

end

逻辑如下。主类MjrClass 为最终用户定义接口。在内部,它(通常)创建了几个SubClass 类的实例。由于它们共享一些属性和方法,它们都继承自 AbsClass 类。而且因为AbsClass这个类本身没有目的,所以定义为抽象类。

然而,Matlab 抱怨它“无法访问类 'AbsClass' 中的方法 'AbsClass'”。问题显然是构造函数方法的Access 属性。但是,如果我将其公开,它并不能反映它只能在 MjrClass 类中实例化的事实。

同样的问题适用于SubClass 类的do() 方法,其中Access = private 应限制该方法在AbsClass 构造函数中只能调用一次,不允许用户调用它。

【问题讨论】:

【参考方案1】:

AbsClass 构造函数的访问说明符实际上不允许AbsClass 调用该方法。所以,修复很简单,允许AbsClass(及其子类)调用自己的构造函数,如下所示:

methods (Access = ?MjrClass, ?AbsClass)
    function obj = AbsClass(...)
     ....

【讨论】:

这实际上是合乎逻辑的。谢谢你。然而,Matlab 说: Access list — 一个或多个类的列表。只有定义类和列表中的类可以访问该属性所应用的类成员。如果您指定一个类列表,MATLAB® 不允许任何其他类访问(也就是说,访问是私有的,除了列出的类)。所以我认为该类可以始终访问自己的成员。 尽管如此,类构造函数仍然无法访问do()方法。 不,do 是子类的private。您可以将其设为protected,或提供显式访问权限。 关于为什么子类无法访问构造函数的更多信息 - 在您的情况下,尝试构造 SubClass 的实例 有效 使用隐式定义的 SubClass 构造函数方法。该方法尝试调用超类构造方法,但被拒绝访问。一旦该问题得到解决,AbsClass.AbsClass 会尝试调用SubClass.do,但由于它是私有的而被拒绝。 (无论如何,既然do 不是AbsClass 中的abstract,那么AbsClass 怎么能确定do 会存在呢?) 我什么都懂。请注意:如果我让do 方法受到保护,它也不起作用,这是我尝试的第一件事。访问权限必须专门设置为AbsClass。我猜是因为protected 允许从子类访问,但我需要从超类访问它。

以上是关于Matlab:如何限制对抽象类方法子类的访问的主要内容,如果未能解决你的问题,请参考以下文章

PHP 抽象类

JAVA学习笔记-抽象类

java_抽象类

抽象类抽象方法

Java中的抽象类

抽象类和接口