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

Создание классов, которые Поддержка Разнородных массивов

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

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

Массивы MATLAB

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

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

Гетерогенные иерархии

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

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

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

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

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

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

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

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

Гетерогенные иерархии полезны для:

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

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

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

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

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

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

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

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

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

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

Природа разнородных массивов

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

  • Класс Array

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

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

Класс разнородных массивов

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

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

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

  • Все объекты в правой части оператора назначения получают из общего подкласса 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 заменяет объект на объект по умолчанию.

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

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

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

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

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

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

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

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

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

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

ary = RootSuperclass.empty;

Похожие темы