【发布时间】: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 构造函数中只能调用一次,不允许用户调用它。
【问题讨论】: