Совместимые с Handle классы и разнородные массивы

Разнородные массивы

Разнородный массив содержит объекты разных классов. Представители из разнородного массива имеют общий суперкласс, но могут принадлежать к различным подклассам. Смотрите matlab.mixin.Heterogeneous Класс для получения дополнительной информации о разнородных массивах. The matlab.mixin.Heterogeneous класс является классом, совместимым с указателем.

Методы должны быть запечатаны

Можно вызвать только те методы, которые запечатаны общим суперклассом на разнородных массивах (Sealed для атрибута задано значение true). Запечатанные методы препятствуют переопределению подклассов этими методами и гарантируют, что методы, вызываемые на разнородных массивах, имеют одно и то же определение для всего массива.

Подклассы не могут переопределить запечатанные методы. В ситуациях, требующих, чтобы подклассы специализировали методы, заданные классом утилиты, можно использовать шаблон проекта, называемый методом шаблона.

Метод шаблона

Предположим, что вы реализуете совместимый с указатель класс, который работает с разнородными массивами. Этот подход позволяет вам запечатывать общедоступные методы, предоставляя способ для каждого подкласса специализироваться на работе метода с каждым образцом подкласса. В классе, совместимом с указателем:

  • Задайте запечатанный метод, который принимает разнородный массив как вход.

  • Задайте защищенный, абстрактный метод, который должен реализовать каждый подкласс.

  • В рамках запечатанного метода вызовите переопределенный метод для каждого элемента массива.

Каждый подкласс в гетерогенной иерархии реализует конкретную версию абстрактного метода. Конкретный метод обеспечивает специализированное поведение, требуемое конкретным подклассом.

The Printable класс показывает, как реализовать подход метода шаблона:

classdef (HandleCompatible) Printable
   methods(Sealed)
      function print(aryIn)
         n = numel(aryIn);
         for k=1:n
            printElement(aryIn(k));
         end
      end
   end
   methods(Access=protected, Abstract)
      printElement(objIn)
   end
end

Похожие темы