2017-04-10 5 views
1

Private functions은 Matlab에서 "private"라는 이름의 폴더에 저장된 함수이며이 폴더 바로 위에있는 함수에서만 사용할 수 있습니다. Matlab의 클래스를 개인용 함수와 유사하게 숨기기

나는 클래스 같은 시도했지만 matlab에 2016b는 나 개인 디렉토리 아래되지 않을 수 있습니다

클래스의 정의를 거부했다.

툴박스를 쓰고 있는데, 내부 클래스가 Matlab 내에서 보이지 않도록하고 싶습니다. 자바에서 클래스가 개인적으로 동작하는 방식이나 Matlab의 개인 함수가 작동하는 방식과 유사하게 검색 경로에 나타나서는 안됩니다.

방법이 있을까요? 그렇다면 어떻게 할 수 있습니까?

답변

2

MATLAB에서 클래스를 비공개로 만들 수있는 방법이 없습니다. 그래도 할 수있는 일은 하위 패키지에 배치하는 것이므로 나머지 패키지와는 별도의 네임 스페이스에 배치됩니다. 당신이 당신의 클래스에 대한 액세스를 필요로하는 모든 내부 기능에 대한 internal을 입력 요구 사항을 제거하려면

+mypackage 
    +internal 
     myclass.m 

, 당신은 당신의 private 폴더에 래퍼 함수를 ​​추가 할 수

+mypackage/private/myclass.m

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

패키지의 외부에서 클래스의 사용을 정말로 제한하려면 생성자 내에 일부 논리를 배치하여 ensu 호출 클래스는 패키지

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있어 함께. 당신은 당신이 MyClass에 여전히 검색 경로에서 찾을 수 있습니다

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

액세스를 부여하고자하는 각 클래스를 지정해야하지만, 적어도 네임 스페이스와의 멤버 인스턴스화의 한계와 togehterh 것 이 패키지는 내 질문에 완전히 대답합니다. – Trilarion

+0

@ 트릴 리언 내가 아는 한, 검색 경로에서 제거 할 수있는 방법이 없습니다. – Suever

+0

대신에'dbstack'을 사용하는 해킹 대신 생성자의'Access' 속성을 패키지의 특정 클래스로 제한 할 수 있습니다. 예를 들어,'methods (Access =? mypackage.myOtherClass) '. 이것은 당신에게 패키지 레벨의 프라이버시를 정확하게주지는 않을 것이다. (당신은'Access =? mypackage'를 사용할 수 없다.) 그러나 다른 클래스에 대한 접근을 제한하는 것은 보통 당신이 어쨌든 원했던 것이다. 'Access = {? mypackage.myClass1,? mypackage.myClass2}'등을 사용하여 여러 개의 클래스를 지정할 수 있습니다. –