exponenta event banner

Разработка разнородных иерархий классов

Создание классов, поддерживающих гетерогенные массивы

В этом разделе описываются понятия, используемые при определении классов, поддерживающих формирование гетерогенных массивов. Сведения о конкатенации существующих объектов MATLAB ® см. в следующих разделах.

Пример использования гетерогенных массивов см. в разделе Иерархия классов для гетерогенных массивов.

Массивы MATLAB

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

Массивы объектов в MATLAB однородны в классе. Благодаря этой однородности можно выполнять операции над целыми массивами, например умножение числовых матриц. Можно сформировать разнородные массивы, определив иерархию классов, которые являются производными от общего суперкласса. Массивы ячеек предоставляют опцию для типа массива, который может содержать различные виды несвязанных объектов.

Разнородные иерархии

Можно формировать массивы объектов, которые являются подклассами общего суперкласса, когда эти классы являются частью гетерогенной иерархии. Иерархия гетерогенных классов MATLAB:

  • Происходит от matlab.mixin.Heterogeneous

  • Определяет один корневой суперкласс, производный непосредственно от matlab.mixin.Heterogeneous

  • Запечатывает методы, унаследованные подклассами.

Например, на следующей диаграмме: Shape является корнем разнородной иерархии.

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

Гетерогенный массив - это массив объектов, отличающихся определенным классом, но все объекты являются производными от общего суперкласса или являются его экземплярами. Общий суперкласс образует корень иерархии классов, которые можно объединить в разнородные массивы.

Общий суперкласс должен быть производным от matlab.mixin.Heterogeneous. Методы, которые можно вызвать для массива в целом, должны иметь одинаковые определения для всех подклассов.

Разнородные иерархии полезны для:

  • Создание массивов объектов, относящихся к разным классам, но являющихся частью связанной иерархии.

  • Методы вызова наиболее конкретного общего суперкласса в массиве в целом

  • Доступ к свойствам наиболее конкретного общего суперкласса с помощью точечной нотации с массивом

  • Использовать общие операторы, поддерживаемые для массивов объектов

  • Поддержка индексирования массива (скалярного или нескалярного), которое возвращает массивы наиболее определенного класса

Концепции гетерогенных массивов

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

  • Корневой суперкласс - класс, полученный непосредственно из matlab.mixin.Heterogeneous. Корневой суперкласс может быть абстрактным или конкретным. Только конкретные подклассы корневого суперкласса могут образовывать гетерогенные массивы.

  • Самый специфический общий суперкласс - самый специфический класс в иерархии наследования, из которого происходят все объекты в гетерогенном массиве. Наиболее конкретным общим суперклассом может быть корневой суперкласс или более конкретный суперкласс, совместно используемый объектами, находящимися в данный момент в массиве.

  • Класс гетерогенного массива - наиболее специфический общий суперкласс, из которого получаются все объекты гетерогенного массива. Добавление и удаление объектов из гетерогенного массива может изменить наиболее конкретный суперкласс, совместно используемый экземплярами. Это изменение приводит к изменению класса гетерогенного массива. Наиболее специфический общий суперкласс может быть абстрактным.

Природа гетерогенных массивов

Гетерогенная иерархия на этой диаграмме иллюстрирует характеристики гетерогенных массивов, касающиеся:

  • Класс массива

  • Доступ к свойству

  • Вызов метода

Класс гетерогенных массивов

Класс гетерогенного массива является классом наиболее определенного суперкласса, совместно используемого объектами массива.

Если выполняются следующие условия, операции конкатенации и подстрочного назначения возвращают гетерогенный массив:

  • Объекты в правой части инструкции присваивания имеют различные классы.

  • Все объекты в правой части инструкции назначения происходят из общего подкласса matlab.mixin.Heterogeneous

Например, сформируйте массив путем конкатенации объектов этих классов. Класс a1 является ClassA:

a1 = [SpecificA,SpecificB];
class(a1)
ans =

ClassA

Если массив включает объект класса SpecificC, класс a2 является RootSuperclass:

a2 = [SpecificA,SpecificB,SpecificC];
class(a2)
ans =

RootSuperclass

Если присвоен объект класса SpecificC выстраивать a1 с использованием индексации, класс a1 становится RootSuperclass:

a1(3) = SpecificC;
class(a1)
ans =

RootSuperclass

Если массив содержит объекты только одного класса, то массив не является гетерогенным. Например, класс a является SpecificA.

a = [SpecificA,SpecificA];
class(a)
ans =

SpecificA

Доступ к свойству

Доступ к свойствам массива с точечной нотацией при определении свойств классом массива. Класс массива является наиболее специфическим общим суперклассом, который гарантирует, что все объекты наследуют одинаковые свойства.

Например, предположим ClassA определяет свойство с именем Prop1.

a1 = [SpecificA,SpecificB];
a1.Prop1

Ссылаясь на Prop1 использование точечной нотации возвращает значение Prop1 для каждого объекта в массиве.

Вызов методов

Чтобы вызвать метод в гетерогенном массиве, класс массива должен определить или унаследовать метод как Sealed. Например, предположим RootSuperclass определяет Sealed метод вызывается superMethod.

Вызов метода для всех объектов массива a2:

a2 = [SpecificA,SpecificB,SpecificC];
a2.superMethod

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

Неподдерживаемые иерархии

Разнородные иерархии не могут иметь неоднозначности при получении объектов по умолчанию, определении класса массива и преобразовании объектов класса в другие типы. Члены иерархии могут быть производными только от одного корневого суперкласса (то есть только от одного прямого подкласса matlab.mixin.Heterogeneous).

На этой схеме показана недопустимая иерархия:

ClassA происходит от двух классов, которые являются подклассами matlab.mixin.Heterogeneous.

Следующая диаграмма показывает две отдельные разнородные иерархии. ClassA имеет только один корневой суперкласс (называется OtherBaseClass). Разнородная иерархия больше не неоднозначна:

Объект по умолчанию

Объект по умолчанию - это объект, возвращаемый путем вызова конструктора класса без аргументов. MATLAB использует объекты по умолчанию в следующих ситуациях:

  • Индексированное назначение создает массив с пробелами в элементах массива. Например, назначить первый элемент массива h к индексу 5:

    h(5) = ClassA(arg1,arg2);

    MATLAB заполняет неназначенные позиции объектами по умолчанию.

  • Загрузка гетерогенного массива из MAT-файла, когда определение класса определенного объекта в массиве недоступно. MATLAB заменяет объект объектом по умолчанию.

Разнородные иерархии позволяют определить объект по умолчанию для этой иерархии. matlab.mixin.Heterogeneous класс обеспечивает реализацию по умолчанию метода, вызываемого getDefaultScalarElement. Этот метод возвращает экземпляр корневого класса гетерогенной иерархии, если только корневой суперкласс не является абстрактным.

Если корневой суперкласс является абстрактным или не подходит для объекта по умолчанию, переопределите getDefaultScalarElement способ. Реализация getDefaultScalarElement переопределение в корневом суперклассе, которое происходит непосредственно из matlab.mixin.Heterogeneous.

getDefaultScalarElement должен возвращать скалярный объект, производный от корневого суперкласса. Конкретные сведения о том, как реализовать этот метод, см. в разделе getDefaultScalarElement.

Преобразование во время назначения и конкатенации

При создании гетерогенного массива, содержащего объекты, не производные от одного и того же корневого суперкласса, MATLAB пытается вызвать метод с именем convertObject. Орудие convertObject для преобразования объектов в соответствующий класс. Реализация этого метода по умолчанию отсутствует.

Для поддержки формирования гетерогенных массивов с использованием объектов, не входящих в гетерогенную иерархию, реализуйте convertObject метод в корневом суперклассе. convertObject метод должен преобразовать объект, не являющийся членом, в действительный член гетерогенной иерархии.

Для получения подробной информации о внедрении convertObject метод, см. matlab.mixin.Heterogeneous.

Пустые массивы гетерогенных абстрактных классов

Для однородных массивов MATLAB не позволяет инициализировать пустой массив абстрактного класса. Однако если класс является частью гетерогенной иерархии, можно инициализировать пустые массивы абстрактного класса. Инициализация пустого гетерогенного массива полезна в тех случаях, когда заранее не известен класс конкретных элементов.

Например, предположим RootSuperclass - абстрактный класс, являющийся корнем разнородной иерархии. Инициализация массива с помощью empty статический метод:

ary = RootSuperclass.empty;

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