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.
内实例化的事实
同样的问题适用于SubClass
class的do()
方法,其中Access = private
应该限制方法在AbsClass
中只能调用一次构造函数,不允许用户调用它。
AbsClass
构造函数的访问说明符实际上不允许 AbsClass
调用该方法。所以,修复很简单,允许 AbsClass
(及其子类)调用它自己的构造函数,像这样:
methods (Access = {?MjrClass, ?AbsClass})
function obj = AbsClass(...)
....
让我们有以下三个 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.
同样的问题适用于SubClass
class的do()
方法,其中Access = private
应该限制方法在AbsClass
中只能调用一次构造函数,不允许用户调用它。
AbsClass
构造函数的访问说明符实际上不允许 AbsClass
调用该方法。所以,修复很简单,允许 AbsClass
(及其子类)调用它自己的构造函数,像这样:
methods (Access = {?MjrClass, ?AbsClass})
function obj = AbsClass(...)
....