Абстрактные классы полезны для описания функциональности, которая характерна для группы классов, но требует уникальных реализаций в каждом классе.
Терминология абстрактного класса
Абстрактный класс служит основанием (то есть, суперкласс) для группы связанных подклассов. Абстрактный класс может задать абстрактные свойства и методы, который разделяет реализацию на подклассы. Каждый подкласс может реализовать конкретные свойства и методы способом, который поддерживает их конкретные требования.
Подкласс должен реализовать все наследованные абстрактные свойства и методы, чтобы стать реальным классом. В противном случае подкласс является самостоятельно абстрактным классом.
MATLAB® не обеспечивает подклассы, чтобы реализовать конкретные методы с той же подписью или атрибутами.
Абстрактные классы:
Может задать свойства и методы, которые не абстрактны
Передайте их конкретных участников посредством наследования
Не должны задавать абстрактных участников
Класс абстрактен, когда он объявляет:
Атрибут класса Abstract
Абстрактный метод
Абстрактное свойство
Если подкласс абстрактного класса не задает конкретные реализации для всех наследованных абстрактных методов или свойств, это также абстрактно.
Объявите класс как краткий обзор в операторе classdef
:
classdef (Abstract) AbsClass ... end
Для классов, которые объявляют атрибут класса Abstract
:
Конкретные подклассы должны переопределить любые свойства или методы, которые объявляются как краткий обзор.
Абстрактный класс не должен задавать абстрактные методы или свойства.
Когда вы задаете любые абстрактные методы или свойства, MATLAB автоматически устанавливает класс атрибут Abstract
на true
.
Задайте абстрактный метод:
methods (Abstract) abstMethod(obj) end
Для методов, которые объявляют атрибут метода Abstract
:
Не используйте блок function...end
, чтобы задать абстрактный метод, использовать только сигнатуру метода.
Абстрактные методы не имеют никакой реализации в абстрактном классе.
Конкретные подклассы не требуются, чтобы поддерживать то же количество аргументов ввода и вывода и не должны использовать те же имена аргумента. Однако подклассы обычно используют ту же подпись при реализации их версии метода.
Задайте абстрактное свойство:
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
, подкласс становится конкретным.