Абстрактные классы полезны для описания функциональности, которая является общей для группы классов, но требует уникальных реализаций в каждом классе.
Абстрактный класс служит базисом (то есть суперклассом) для группы связанных подклассов. Абстрактный класс может задать абстрактные свойства и методы, которые реализуют подклассы. Каждый подкласс может реализовать конкретные свойства и методы таким образом, чтобы поддерживать их конкретные требования.
Подкласс должен реализовать все унаследованные абстрактные свойства и методы, чтобы стать конкретным классом. В противном случае подкласс сам по себе является абстрактным классом.
MATLAB® не заставляет подклассы реализовывать конкретные методы с той же сигнатурой или атрибутами.
Абстрактные классы:
Можно задать свойства и методы, которые не являются абстрактными
Передайте свои конкретные представители через наследство
Не нужно задавать какие-либо абстрактные представители
Класс является абстрактным, когда он объявляет:
The 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
The SubAbsClass
класс абстрактен, потому что не реализовал absMethodOne
метод, заданный в AbsClass
.
msub = ?SubAbsClass; msub.Abstract
ans = 1
Если вы реализуете оба метода, определенных в AbsClass
подкласс становится конкретным.