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