Материалы, представленные в этом разделе, основаны на понимании следующей информации:
Списки управления доступом позволяют управлять доступом к определенным свойствам класса, методам и событиям. В списках управления доступом указывается список классов, которым предоставляется доступ к этим членам класса.
Этот метод обеспечивает большую гибкость и контроль при проектировании системы классов. Например, используйте списки управления доступом для определения отдельных классов, но не разрешайте доступ членам класса из-за пределов системы классов.
Укажите классы, которым разрешен доступ к определенному члену класса в инструкции атрибута доступа к члену. Например:
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 является абстрактным классом. За реализацию абстрактного метода с использованием сигнатуры функции, объявленной в определении класса, отвечают подклассы.
Когда абстрактный метод имеет список доступа, только классы в списке доступа могут реализовать метод. Подкласс, отсутствующий в списке доступа, не может реализовать абстрактный метод, так что подкласс сам является абстрактным.