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

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

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

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

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

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

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

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

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

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

  • Передайте их конкретных участников посредством наследования

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

Объявление классов как краткого обзора

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

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

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

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

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

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

Объявите класс как краткий обзор в операторе classdef:

classdef (Abstract) AbsClass 
   ...
end

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

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

  • Абстрактный класс не должен задавать абстрактные методы или свойства.

Когда вы задаете любые абстрактные методы или свойства, MATLAB автоматически устанавливает класс атрибут Abstract на true.

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

Задайте абстрактный метод:

methods (Abstract)
   abstMethod(obj)
end

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

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

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

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

Abstract Properties

Задайте абстрактное свойство:

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

Нахождение Inherited Abstract Properties и методов

Функция 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, подкласс становится конкретным.

Похожие темы

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