在Matlab中的Private functions是存儲在名稱爲「private」的文件夾中的函數,並且它們僅對此文件夾正上方的函數可用。在Matlab中隱藏類似於私有函數
我試過同爲類,但Matlab的2016B與
類定義拒絕可能無法在或低於私有目錄。
我正在寫一個工具箱,我希望一些內部類在Matlab自身內部不可見,例如,它們不應該出現在搜索路徑中,類似於Java中私有類的行爲或Matlab中私有函數的行爲。
有沒有辦法,如果有,怎麼辦?
在Matlab中的Private functions是存儲在名稱爲「private」的文件夾中的函數,並且它們僅對此文件夾正上方的函數可用。在Matlab中隱藏類似於私有函數
我試過同爲類,但Matlab的2016B與
類定義拒絕可能無法在或低於私有目錄。
我正在寫一個工具箱,我希望一些內部類在Matlab自身內部不可見,例如,它們不應該出現在搜索路徑中,類似於Java中私有類的行爲或Matlab中私有函數的行爲。
有沒有辦法,如果有,怎麼辦?
在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的一員,你也可以把一個方法塊內的構造與它的Access
restricted to members of the class。您需要指定每個類的,你想被授予訪問
classdef myclass
methods (Access = {?mypackage.Class1, ?mypackage.Class2})
function self = myclass()
% Constructor
end
end
end
MyClass的仍然可以在搜索路徑中找到,但至少在命名空間中,並與實例來的成員極限togehterh這個包完全回答了我的問題。 – Trilarion
@Trilarion據我所知,無法從您的搜索路徑中刪除它。 – Suever
而不是使用'dbstack'進行破解,而是可以將構造函數的'Access'屬性限制爲包中的特定類 - 例如,通過將其放置在方法塊中,如方法(Access =?mypackage.myOtherClass) '。這不會完全給你包級隱私(你不能使用'Access =?mypackage'),但限制訪問另一個類通常是你最終想要的。你可以使用'Access = {?mypackage.myClass1,?mypackage.myClass2}'等來指定多個類。 –