exponenta event banner

Классы, совместимые с дескрипторами, и гетерогенные массивы

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

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

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

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

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

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

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

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

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

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

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

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

Связанные темы