Изменение унаследованных методов

Когда изменять методы суперкласса

Проекты классов позволяют вам передавать объекты подкласса в суперклассы методы. Метод суперкласса выполняется правильно, потому что объект подкласса является объектом суперкласса. Однако подклассы могут реализовать свои собственные версии методов суперкласса, которые 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

Похожие темы