【问题标题】:Hide classes in Matlab similar to private functions在 Matlab 中隐藏类似于私有函数的类
【发布时间】:2017-04-10 13:25:25
【问题描述】:

Matlab 中的Private functions 是存储在名为“private”的文件夹中的函数,它们仅适用于该文件夹上方的函数。

我尝试了相同的课程,但 Matlab 2016b 拒绝了

类定义可能不在私有目录中或之下。

我正在编写一个工具箱,我希望一些内部类在 Matlab 本身中不可见,例如它们不应出现在搜索路径中,类似于 Java 中类的私有行为方式或 Matlab 中私有函数的行为方式。

有没有办法,如果有,怎么做?

【问题讨论】:

    标签: matlab class private


    【解决方案1】:

    在 MATLAB 中无法将类设为私有。您可以做的是将它放在一个子包中,因此它将被放置在与包的其余部分不同的命名空间中。

    +mypackage
        +internal
            myclass.m
    

    如果您想取消为所有需要访问您的类的内部函数键入 internal 的要求,您可以在您的 private 文件夹中添加一个包装函数

    +mypackage/private/myclass.m

    function obj = myclass(varargin)
        obj = mypackage.internal.myclass(varargin{:});
    end
    

    如果你真的想限制你的包之外的任何东西使用这个类,你可以在构造函数中放置一些逻辑来确保调用类是你包的成员

    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 在 cmets 中提到的,您还可以将构造函数放在一个方法块中,它的名称为Accessrestricted to members of the class。您需要指定您希望被授予访问权限的每个类

    classdef myclass
        methods (Access = {?mypackage.Class1, ?mypackage.Class2})
            function self = myclass()
                % Constructor
            end
        end
    end
    

    【讨论】:

    • myclass 仍然可以在搜索路径中找到,但至少在命名空间和 togehterh 中,以及对包成员的实例化限制,这完全回答了我的问题。
    • @Trilarion 据我所知,没有办法将其从您的搜索路径中删除。
    • 代替使用dbstack的hack,您可以改为将构造函数的Access属性限制为包中的特定类-例如,将其放在像methods (Access = ?mypackage.myOtherClass)这样的方法块中.这不会完全为您提供包级别的隐私(您不能使用Access = ?mypackage),但限制对另一个类的访问通常是您真正想要的。您可以使用Access = {?mypackage.myClass1, ?mypackage.myClass2} 等指定多个类。
    猜你喜欢
    • 2021-09-17
    • 2018-06-05
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    相关资源
    最近更新 更多