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

Matlab: How to restict access to sub-class of abstract class method

让我们有以下三个 classes:

% 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

逻辑如下。 Main class MjrClass 为最终用户定义界面。在内部,它创建(通常)SubClass class 的多个实例。由于它们共享一些属性和方法,它们都继承自 AbsClass class。而且因为 AbsClass class 单独没有任何目的,所以它被定义为抽象 class.

然而,Matlab 抱怨它“无法访问 class 'AbsClass' 中的方法 'AbsClass'”。问题很明显是构造方法的Access属性。但是如果我离开它 public 它并没有反映它应该只在 MjrClass class.

内实例化的事实

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

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

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