在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