Проекты классов позволяют вам передавать объекты подкласса в суперклассы методы. Метод суперкласса выполняется правильно, потому что объект подкласса является объектом суперкласса. Однако подклассы могут реализовать свои собственные версии методов суперкласса, которые MATLAB® вызывается при передаче объектов подкласса.
Подклассы переопределяют унаследованные методы (то есть реализуют метод того же имени), когда существует необходимость обеспечить специализированное поведение в подклассе. Вот некоторые шаблоны, которые переопределяют методы суперкласса.
Расширить метод суперкласса путем вызова его из подкласса метода. Метод подкласса может выполнять специфическую для подкласса обработку в дополнение к вызову метода суперкласса.
В суперкласс способе реализуйте ряд шагов в процедуре с использованием защищенных методов. Затем повторите эти шаги в подкласс методе путем переопределения защищенных методов, которые вызываются из общедоступного метода суперкласса.
Переопределите одноименный метод в подклассе, но используйте различные реализации, чтобы выполнить одну и ту же операцию по-разному для объектов подкласса.
Реализуйте абстрактные методы суперкласса в подклассе. Абстрактные суперклассы могут определять методы без реализации и полагаться на подклассы, чтобы обеспечить реализацию. Для получения дополнительной информации смотрите Задать суперкласс интерфейса.
Методы подкласса, которые переопределяют методы суперкласса, должны определять одно и то же значение для Access
атрибут, как определено методом суперкласса.
Вызов одноименного метода суперкласса из подкласса позволяет расширить метод суперкласса для объектов подкласса, не влияя на метод суперкласса.
Например, предположим, что и суперкласс, и подкласс определяют метод, называемый foo
. Метод подкласса вызывает метод суперкласса и выполняет другие шаги в дополнение к вызову метода суперкласса. Подкласс может работать со специализированными частями подкласса, которые не являются частью суперкласса.
Для примера этот подкласс задает foo
метод, который вызывает суперкласс foo
метод
classdef Sub < Super methods function foo(obj) % preprocessing steps ... foo@Super(obj); % postprocessing steps ... end end end
Метод суперкласса может задать процесс, который выполняется в серии шагов с использованием метода для каждого шага (обычно Access
для атрибута задано значение protected
для методов шага). Этот шаблон (называемый шаблонным методом) позволяет подклассам создавать свои собственные версии защищенных методов, которые реализуют отдельные шаги в процессе. Процесс специализирован на подклассе.
Реализуйте этот метод, как показано здесь:
classdef Super methods (Sealed) function foo(obj) step1(obj) % Call step1 step2(obj) % Call step2 step3(obj) % Call step3 end end methods (Access = protected) function step1(obj) % Superclass version end function step2(obj) % Superclass version end function step3(obj) % Superclass version end end end
Подкласс не переопределяет foo
способ. Вместо этого он переопределяет только защищенные методы, которые выполняют серию шагов (step1(obj)
, step2(obj)
, step3(obj)
). Этот метод позволяет подклассу специализировать действия, предпринятые каждым шагом, но не управлять порядком шагов в процессе. Когда вы передаете объект подкласса в суперкласс foo
MATLAB вызывает методы подкласса из-за правил диспетчеризации. Для получения дополнительной информации об отправке метода см. «Вызов метода».
classdef Sub < Super ... methods (Access = protected) function step1(obj) % Subclass version end function step2(obj) % Subclass version end function step3(obj) % Subclass version end ... end end
Можно полностью переопределить метод суперкласса в подклассе. В этом случае и суперкласс, и подкласс будут определять метод с таким же именем. Однако реализация будет другой, и подклассовый метод не будет вызывать суперкласс. Создание независимых версий одноименного метода может потребоваться, когда одна и та же операция требует различной реализации на суперклассе и подклассе.
classdef Super methods function foo(obj) % Superclass implementation end end end
classdef Sub < Super methods function foo(obj) % Subclass implementation end end end
Абстрактные методы не имеют никакой реализации. Подклассы, которые наследуют абстрактные методы, должны обеспечивать специфичную для подкласса реализацию, чтобы подкласс был конкретным классом. Для получения дополнительной информации см. «Абстрактные классы и члены класса».
classdef Super methods (Abstract) foo(obj) % Abstract method without implementation end end end
classdef Sub < Super methods function foo(obj) % Subclass implementation of concrete method end end end