2017-04-10 68 views
1

在Matlab中的Private functions是存儲在名稱爲「private」的文件夾中的函數,並且它們僅對此文件夾正上方的函數可用。在Matlab中隱藏類似於私有函數

我試過同爲類,但Matlab的2016B與

類定義拒絕可能無法在或低於私有目錄。

我正在寫一個工具箱,我希望一些內部類在Matlab自身內部不可見,例如,它們不應該出現在搜索路徑中,類似於Java中私有類的行爲或Matlab中私有函數的行爲。

有沒有辦法,如果有,怎麼辦?

回答

2

在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的一員,你也可以把一個方法塊內的構造與它的Accessrestricted to members of the class。您需要指定每個類的,你想被授予訪問

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

MyClass的仍然可以在搜索路徑中找到,但至少在命名空間中,並與實例來的成員極限togehterh這個包完全回答了我的問題。 – Trilarion

+0

@Trilarion據我所知,無法從您的搜索路徑中刪除它。 – Suever

+0

而不是使用'dbstack'進行破解,而是可以將構造函數的'Access'屬性限制爲包中的特定類 - 例如,通過將其放置在方法塊中,如方法(Access =?mypackage.myOtherClass) '。這不會完全給你包級隱私(你不能使用'Access =?mypackage'),但限制訪問另一個類通常是你最終想要的。你可以使用'Access = {?mypackage.myClass1,?mypackage.myClass2}'等來指定多個類。 –

相關問題