在Matlab中隐藏类类似于私有函数
Hide classes in Matlab similar to private functions
Matlab 中的 Private functions 是存储在名称为 "private" 的文件夹中的函数,它们仅适用于紧靠该文件夹上方的函数。
我对 类 进行了同样的尝试,但 Matlab 2016b 拒绝了
A class definition may not be in or below a private directory.
我正在编写一个工具箱,我希望一些内部 类 在 Matlab 本身内不可见,例如它们不应出现在搜索路径中,类似于 Java 中 类 的私有行为或 Matlab 中私有函数的行为方式。
有没有办法,如果有,怎么办?
无法在 MATLAB 中将 class 设为私有。不过,您可以做的是将它放在一个子包中,因此它将与您的包的其余部分放在一个单独的命名空间中。
+mypackage
+internal
myclass.m
如果您想要为所有需要访问您的 class 的内部函数删除键入 internal
的要求,您可以在 private
文件夹中添加一个包装函数
+mypackage/private/myclass.m
function obj = myclass(varargin)
obj = mypackage.internal.myclass(varargin{:});
end
如果你真的想限制包外的任何东西使用 class 你可以在构造函数中加入一些逻辑来确保调用 class 是你包的成员
classdef myclass < handle
methods
function self = myclass()
% Get the path to the package folder
directory = fileparts(fileparts(mfilename('fullpath')));
% Ensure that the function/class that called this was part of te toolbox
S = dbstack('-completenames');
assert(numel(S) > 1 && strfind(S(2).file, directory), ...
'Class only able to be called from the toolbox')
end
end
end
更新
正如@SamRoberts 在评论中提到的,您还可以将构造函数放在一个方法块中,它是 Access
restricted to members of the class。您需要指定您希望被授予访问权限的每个 classes
classdef myclass
methods (Access = {?mypackage.Class1, ?mypackage.Class2})
function self = myclass()
% Constructor
end
end
end
Private functions 是存储在名称为 "private" 的文件夹中的函数,它们仅适用于紧靠该文件夹上方的函数。
我对 类 进行了同样的尝试,但 Matlab 2016b 拒绝了
A class definition may not be in or below a private directory.
我正在编写一个工具箱,我希望一些内部 类 在 Matlab 本身内不可见,例如它们不应出现在搜索路径中,类似于 Java 中 类 的私有行为或 Matlab 中私有函数的行为方式。
有没有办法,如果有,怎么办?
无法在 MATLAB 中将 class 设为私有。不过,您可以做的是将它放在一个子包中,因此它将与您的包的其余部分放在一个单独的命名空间中。
+mypackage
+internal
myclass.m
如果您想要为所有需要访问您的 class 的内部函数删除键入 internal
的要求,您可以在 private
文件夹中添加一个包装函数
+mypackage/private/myclass.m
function obj = myclass(varargin)
obj = mypackage.internal.myclass(varargin{:});
end
如果你真的想限制包外的任何东西使用 class 你可以在构造函数中加入一些逻辑来确保调用 class 是你包的成员
classdef myclass < handle
methods
function self = myclass()
% Get the path to the package folder
directory = fileparts(fileparts(mfilename('fullpath')));
% Ensure that the function/class that called this was part of te toolbox
S = dbstack('-completenames');
assert(numel(S) > 1 && strfind(S(2).file, directory), ...
'Class only able to be called from the toolbox')
end
end
end
更新
正如@SamRoberts 在评论中提到的,您还可以将构造函数放在一个方法块中,它是 Access
restricted to members of the class。您需要指定您希望被授予访问权限的每个 classes
classdef myclass
methods (Access = {?mypackage.Class1, ?mypackage.Class2})
function self = myclass()
% Constructor
end
end
end