Абстрактные классы полезны для описания функциональности, которая характерна для группы классов, но требует уникальных реализаций в каждом классе.
Терминология абстрактного класса
Абстрактный класс служит основанием (то есть, суперкласс) для группы связанных подклассов. Абстрактный класс может задать абстрактные свойства и методы, который разделяет реализацию на подклассы. Каждый подкласс может реализовать конкретные свойства и методы способом, который поддерживает их конкретные требования.
Подкласс должен реализовать все наследованные абстрактные свойства и методы, чтобы стать реальным классом. В противном случае подкласс является самостоятельно абстрактным классом.
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
, подкласс становится конкретным.