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