Материал, представленный в этом разделе, основывается на понимании следующей информации:
Списки управления доступом позволяют вам управлять доступом к определенным свойствам класса, методам и событиям. Списки управления доступом задают список классов, к которым вы предоставляете доступ к этим членам класса.
Этот метод обеспечивает большую гибкость и управление в проекте системы классов. Например, используйте списки управления доступом, чтобы задать отдельные классы, но не предоставить доступ к членам класса снаружи системы класса.
Задайте классы, которым позволяют получить доступ к конкретному члену класса в операторе атрибута доступа члена. Например:
methods (Access = {?ClassName1,?ClassName2,...})
Используйте класс meta.class
объект относиться к классам в списке доступа. Чтобы задать больше чем один класс, используйте массив ячеек meta.class
объекты. Используйте имя пакета при обращении к классам, которые находятся в пакетах.
Задайте meta.class
объекты явным образом (созданный с ?
оператор), не как значения, возвращенные функциями или другими выражениями MATLAB.
Предоставление доступа к списку классов ограничивает доступ к только:
Класс определения
Классы в списке
Подклассы классов в списке
Включая класс определения в списке доступа дает все подклассы доступа к классу определения.
MATLAB разрешает ссылки на классы в списке доступа только, когда класс загружается. Если MATLAB не может найти класс, который включен в список доступа, тот класс эффективно удален из доступа.
MATLAB заменяет неразрешенный meta.class
записи в списке с пустым meta.class
объекты.
Пустой список доступа (то есть, массив пустой ячейки) эквивалентен private
доступ.
Сгенерируйте meta.class
объекты с помощью только ?
оператор и имя класса. Значения, присвоенные атрибутам, не могут содержать никакие другие выражения MATLAB, включая функции, которые возвращают позволенные значения атрибута:
meta.class
объекты
Массивы ячеек meta.class
объекты
Значения public
, protected
, или private
Задайте эти значения явным образом, как показано в примере кода в этом разделе.
Эти демонстрационные классы показывают поведение свойства что доступ для чтения предоставлений (GetAccess
) к классу. GrantAccess
класс дает GetAccess
к NeedAccess
класс для Prop1
свойство:
classdef GrantAccess properties (GetAccess = ?NeedAccess) Prop1 = 7 end end
NeedAccess
класс задает метод, который использует значение GrantAccess
Prop1
значение. dispObj
метод задан как Static
метод, однако, это мог быть обычный метод.
classdef NeedAccess methods (Static) function dispObj(GrantAccessObj) disp(['Prop1 is: ',num2str(GrantAccessObj.Prop1)]) end end end
Получите доступ к Prop1
является частным, таким образом, MATLAB возвращает ошибку, при попытке получить доступ к свойству снаружи определения класса. Например, из командной строки:
a = GrantAccess; a.Prop1
Getting the 'Prop1' property of the 'GrantAccess' class is not allowed.
Однако MATLAB предоставляет доступ к Prop1
NeedAccess
класс:
NeedAccess.dispObj(a)
Prop1 is: 7
Классы предоставили доступ к методу, может:
Вызовите метод с помощью экземпляра класса определения.
Задайте их собственный метод с тем же именем (если не подкласс).
Замените метод в подклассе, только если суперкласс, задающий метод, включает себя или подкласс в списке доступа.
Эти демонстрационные классы показывают поведение методов, названных из методов других классов, которые находятся в списке доступа. Класс AcListSuper
дает AcListNonSub
доступ к классу к его m1
метод:
classdef AcListSuper methods (Access = {?AcListNonSub}) function obj = m1(obj) disp ('Method m1 called') end end end
Поскольку AcListNonSub
находится в списке доступа m1
, его методы могут вызвать m1
использование экземпляра AcListSuper
:
classdef AcListNonSub methods function obj = nonSub1(obj,AcListSuper_Obj) % Call m1 on AcListSuper class AcListSuper_Obj.m1; end function obj = m1(obj) % Define a method named m1 disp(['Method m1 defined by ',class(obj)]) end end end
Создайте объекты обоих классов:
a = AcListSuper; b = AcListNonSub;
Вызовите AcListSuper
m1
метод с помощью AcListNonSub
метод:
b.nonSub1(a);
Method m1 called
Вызовите AcListNonSub
m1
метод:
b.m1;
Method m1 defined by AcListNonSub
Включая класс определения в списке доступа для метода предоставляет доступ ко всем подклассам, выведенным из того класса. Когда вы выводите из класса, который имеет метод со списком доступа, и тот список не включает класс определения:
Методы подклассов не могут вызвать метод суперкласса.
Методы подклассов могут вызвать метод суперкласса косвенно с помощью экземпляра класса, который находится в списке доступа.
Подклассы не могут заменить метод суперкласса.
Методы классов, которые находятся в списке доступа метода суперкласса, но которые не являются подклассами, могут вызвать метод суперкласса.
Например, AcListSub
подкласс AcListSuper
. AcListSuper
класс задает список доступа для метода m1
. Однако этот список не включает AcListSuper
, так подклассы AcListSuper
не имейте доступа к методу m1
:
classdef AcListSub < AcListSuper methods function obj = sub1(obj,AcListSuper_Obj) % Access m1 via superclass object (***NOT ALLOWED***) AcListSuper_Obj.m1; end function obj = sub2(obj,AcListNonSub_Obj,AcListSuper_obj) % Access m1 via object that is in access list (is allowed) AcListNonSub_Obj.nonSub1(AcListSuper_Obj); end end end
Попытка вызвать суперкласс m1
метод от sub1
метод приводит к ошибке, потому что подклассы не находятся в списке доступа для m1
:
a = AcListSuper; c = AcListSub; c.sub1(a);
Cannot access method 'm1' in class 'AcListSuper'.
Error in AcListSub/sub1 (line 4)
AcListSuper_Obj.m1;
Можно вызвать метод суперкласса от подкласса, который не имеет доступа к тому методу с помощью объекта класса, который находится в списке доступа метода суперкласса.
AcListSub
sub2
вызовы метода метод класса (AcListNonSub
) это находится на списке доступа для m1
. Этот метод, nonSub1
, действительно имеет доступ к суперклассу m1
метод:
a = AcListSuper; b = AcListNonSub; c = AcListSub; c.sub2(b,a);
Method m1 called
Когда подклассы не включены в список доступа для метода, те подклассы не могут задать метод с тем же именем. Это поведение не является тем же самым как случаями в который метод Access
явным образом объявляется как private
.
Например, добавляя следующий метод в AcListSub
определение класса производит ошибку, когда вы пытаетесь инстанцировать класса.
methods (Access = {?AcListNonSub}) function obj = m1(obj) disp('AcListSub m1 method') end end
c = AcListSub;
Class 'AcListSub' is not allowed to override the method 'm1' because neither it nor its
superclasses have been granted access to the method by class 'AcListSuper'.
AcListNonSub
класс находится в m1
список доступа метода. Этот класс может задать метод, который вызывает m1
метод с помощью объекта AcListSub
класс. В то время как AcListSub
не находится в списке доступа для метода m1
, это - подкласс AcListSuper
.
Например, добавьте следующий метод в AcListNonSub
класс:
methods function obj = nonSub2(obj,AcListSub_Obj) disp('Call m1 via subclass object:') AcListSub_Obj.m1; end end
Вызов nonSub2
метод приводит к выполнению суперкласса m1
метод:
b = AcListNonSub; c = AcListSub; b.nonSub2(c);
Call m1 via subclass object: Method m1 called
Это поведение сопоставимо с поведением любого объекта подкласса, который может заменить объект его суперкласса.
Класс, содержащий метод, объявленный как Abstract
абстрактный класс. Это - ответственность подклассов реализовать абстрактный метод с помощью функциональной подписи, объявленной в определении класса.
Когда абстрактный метод имеет список доступа, только классы в списке доступа могут реализовать метод. Подкласс, который не находится в списке доступа, не может реализовать абстрактный метод так, чтобы подкласс был самостоятельно абстрактен.