Эта тема описывает концепции, вовлеченные в определение классов, которые поддерживают формирование разнородных массивов. Для получения информации о конкатенации существующего 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;