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:如何限制对抽象类方法子类的访问的主要内容,如果未能解决你的问题,请参考以下文章