exponenta event banner

Абстрактные классы и члены классов

Абстрактные классы

Абстрактные классы полезны для описания функциональности, которая является общей для группы классов, но требует уникальных реализаций в каждом классе.

 Терминология абстрактного класса

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

Реализация конкретного подкласса

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

MATLAB ® не заставляет подклассы реализовывать конкретные методы с одной и той же сигнатурой или атрибутами.

Абстрактные классы:

  • Может определять свойства и методы, которые не являются абстрактными

  • Передача их конкретных членов через наследование

  • Не нужно определять абстрактные элементы

Объявить классы как абстрактные

Класс является абстрактным, если он объявляет:

  • Abstract атрибут класса

  • Абстрактный метод

  • Абстрактное свойство

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

Абстрактный класс

Объявить класс как абстрактный в classdef заявление:

classdef (Abstract) AbsClass 
   ...
end

Для классов, объявляющих Abstract атрибут класса:

  • Конкретные подклассы должны переопределять любые свойства или методы, объявленные как абстрактные.

  • Абстрактному классу не требуется определять какие-либо абстрактные методы или свойства.

При определении абстрактных методов или свойств MATLAB автоматически задает класс Abstract атрибут для true.

Абстрактные методы

Определите абстрактный метод:

methods (Abstract)
   abstMethod(obj)
end

Для методов, объявляющих Abstract атрибут метода:

  • Не использовать function...end для определения абстрактного метода используйте только сигнатуру метода.

  • Абстрактные методы не имеют реализации в абстрактном классе.

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

  • Абстрактные методы не могут определить arguments блоки.

Абстрактные свойства

Определите абстрактное свойство:

properties (Abstract)
   AbsProp
end

Для свойств, объявляющих Abstract атрибут свойства:

  • Конкретные подклассы должны переопределять абстрактные свойства без Abstract атрибут.

  • В подклассах бетона должны использоваться одинаковые значения для SetAccess и GetAccess атрибуты как атрибуты, используемые в абстрактном суперклассе.

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

Дополнительные сведения о методах доступа см. в разделе Методы доступа к свойствам.

Определить, является ли класс абстрактным

Определите, является ли класс абстрактным, запросив Abstract собственность его meta.class объект. Например, AbsClass определяет два абстрактных метода:

classdef AbsClass
   methods(Abstract)
      result = absMethodOne(obj)
      output = absMethodTwo(obj)
   end
end

Используйте логическое значение meta.class Abstract чтобы определить, является ли класс абстрактным:

mc = ?AbsClass;
if ~mc.Abstract
   % not an abstract class
end

Отображать абстрактные имена членов

Используйте meta.abstractDetails для отображения имен абстрактных свойств или методов и имен определяющих классов:

meta.abstractDetails('AbsClass');
Abstract methods for class AbsClass:
   absMethodTwo   % defined in AbsClass
   absMethodOne   % defined in AbsClass

Поиск унаследованных абстрактных свойств и методов

meta.abstractDetails функция возвращает имена и определяющий класс любых унаследованных абстрактных свойств или методов, которые не были реализованы в подклассе. Используйте эту функцию, если требуется, чтобы подкласс был конкретным и должен определять, какие абстрактные элементы наследует подкласс.

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

classdef SubAbsClass < AbsClass
% Does not implement absMethodOne
% defined as abstract in AbsClass
   methods
      function out = absMethodTwo(obj)
         ...
      end
   end
end

Определите, были ли реализованы все унаследованные члены класса с помощью meta.abstractDetails:

meta.abstractDetails(?SubAbsClass)
Abstract methods for class SubAbsClass:
   absMethodOne   % defined in AbsClass

SubAbsClass класс является абстрактным, поскольку он не реализовал absMethodOne метод определен в AbsClass.

msub = ?SubAbsClass;
msub.Abstract
ans =

     1

При внедрении обоих методов, определенных в AbsClass, подкласс становится конкретным.

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