Доступ для членов класса

Элементарные знания

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

 Похожие темы

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

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

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

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

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

Определение доступа к членам класса

Задайте классы, которым позволяют получить доступ к конкретному члену класса в операторе атрибута доступа члена. Например:

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

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

Похожие темы