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에서 언급 한 바와 같이 업데이트
의 구성원인지, 당신은 또한 방법은 블록 내에서 생성자를 넣을 수 있습니다 재는 Access
restricted to members of the class있어 함께. 당신은 당신이 MyClass에 여전히 검색 경로에서 찾을 수 있습니다
classdef myclass
methods (Access = {?mypackage.Class1, ?mypackage.Class2})
function self = myclass()
% Constructor
end
end
end
액세스를 부여하고자하는 각 클래스를 지정해야하지만, 적어도 네임 스페이스와의 멤버 인스턴스화의 한계와 togehterh 것 이 패키지는 내 질문에 완전히 대답합니다. – Trilarion
@ 트릴 리언 내가 아는 한, 검색 경로에서 제거 할 수있는 방법이 없습니다. – Suever
대신에'dbstack'을 사용하는 해킹 대신 생성자의'Access' 속성을 패키지의 특정 클래스로 제한 할 수 있습니다. 예를 들어,'methods (Access =? mypackage.myOtherClass) '. 이것은 당신에게 패키지 레벨의 프라이버시를 정확하게주지는 않을 것이다. (당신은'Access =? mypackage'를 사용할 수 없다.) 그러나 다른 클래스에 대한 접근을 제한하는 것은 보통 당신이 어쨌든 원했던 것이다. 'Access = {? mypackage.myClass1,? mypackage.myClass2}'등을 사용하여 여러 개의 클래스를 지정할 수 있습니다. –