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

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

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

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

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

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

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

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

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

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

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

  • Не нужно задавать какие-либо абстрактные представители

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

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

  • The 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

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

msub = ?SubAbsClass;
msub.Abstract
ans =

     1

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

Похожие темы