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