exponenta event banner

Доступ к членам класса

Базовые знания

Материалы, представленные в этом разделе, основаны на понимании следующей информации:

 Связанные темы

 Терминология и концепции

 Возможные значения для доступа к членам класса

Приложения для списков управления доступом

Списки управления доступом позволяют управлять доступом к определенным свойствам класса, методам и событиям. В списках управления доступом указывается список классов, которым предоставляется доступ к этим членам класса.

Этот метод обеспечивает большую гибкость и контроль при проектировании системы классов. Например, используйте списки управления доступом для определения отдельных классов, но не разрешайте доступ членам класса из-за пределов системы классов.

Укажите доступ к членам класса

Укажите классы, которым разрешен доступ к определенному члену класса в инструкции атрибута доступа к члену. Например:

methods (Access = {?ClassName1,?ClassName2,...})

Использовать класс meta.class объект для обращения к классам в списке доступа. Чтобы указать несколько классов, используйте массив ячеек meta.class объекты. Используйте имя пакета при ссылке на классы, которые находятся в пакетах.

Примечание

Укажите meta.class явно (созданные с помощью ? ), а не как значения, возвращаемые функциями или другими выражениями MATLAB.

Как 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 является абстрактным классом. За реализацию абстрактного метода с использованием сигнатуры функции, объявленной в определении класса, отвечают подклассы.

Когда абстрактный метод имеет список доступа, только классы в списке доступа могут реализовать метод. Подкласс, отсутствующий в списке доступа, не может реализовать абстрактный метод, так что подкласс сам является абстрактным.

Связанные темы