Пакет: matlab.mixin
Суперкласс для формирования разнородного массива
matlab.mixin.Heterogeneous
является абстрактным классом, который поддерживает формирующиеся разнородные массивы. Разнородный массив является массивом объектов, которые отличаются по их определенному классу, но все выведены от или являются экземплярами корневого класса. Корневой класс выводит непосредственно от matlab.mixin.Heterogeneous
.
Краткий обзор | tRUE |
HandleCompatible | tRUE |
Для получения информации об атрибутах класса см. Атрибуты класса.
matlab.mixin.Heterogeneous.getDefaultScalarElement | Возвратите объект по умолчанию для операций разнородного массива |
Используйте matlab.mixin.Heterogeneous
, чтобы задать иерархии классов, экземпляры которых можно объединить в разнородные массивы.
Следующее определение класса включает формирование разнородных массивов, которые комбинируют экземпляры любых классов, выведенных от HierarchyRoot
.
classdef HierarchyRoot < matlab.mixin.Heterogeneous % HierarchyRoot is a direct subclass of matlab.mixin.Heterogeneous. % HierarchyRoot is the root of this heterogeneous hierarchy. end
Получение класса HierarchyRoot
непосредственно от matlab.mixin.Heterogeneous
позволяет классу HierarchyRoot
стать корнем иерархии классов. Можно объединить экземпляры членов этой иерархии в разнородный массив. Только экземпляры классов, выведенных от того же корневого класса, могут объединиться, чтобы сформировать допустимый разнородный массив.
Класс разнородного массива всегда является классом самого определенного суперкласса, характерного для всех объектов в массиве. Например, предположите, что вы задаете следующую иерархию классов:
Формирование массива, содержащего экземпляр LeafA
с экземпляром LeafB
, создает массив класса Middle
.
harray = [LeafA LeafB]; class(harray)
ans = Middle
Формирование массива, содержащего экземпляр LeafC
с экземпляром LeafD
, создает массив класса HierarchyRoot
.
harray = [LeafC LeafD]; class(harray)
ans = HierarchyRoot
Формирование массива, содержащего экземпляр LeafA
с другим экземпляром LeafA
, создает гомогенный массив класса LeafA
.
harray = [LeafA LeafA]; class(harray)
ans = LeafA
Можно сформировать разнородные массивы только с объектами, которые выведены от того же корня иерархии (например, класс HierarchyRoot
в иерархии, показанной ранее).
Можно сформировать разнородные массивы с объектами, которые выводят от нескольких суперклассов, но только одно ответвление в иерархии может задать неоднородный корень.
Разнородные массивы являются результатом операций, которые производят массивы, содержащие экземпляры двух или больше классов от неоднородной иерархии. Обычно, операция является конкатенацией или индексированным присвоением. Например, эти операторы формируют разнородный массив с помощью индексированного присвоения.
harray(1) = LeafA; harray(2) = LeafC; class(harray)
ans = Middle
Если массив содержит объекты, выведенные от matlab.mixin.Heterogeneous
, присваивание новых объектов в него может изменить класс массива. Например, рассмотрите гомогенный массив, содержащий объекты только класса LeafA
.
harray = [LeafA,LeafA,LeafA]; class(harray)
ans = LeafA
Добавление объекта различного класса, выведенного от того же корня до гомогенного массива, преобразовывает класс массива в самый определенный суперкласс.
harray(4) = LeafB; class(harray)
ans = Middle
Когда MATLAB® вызывает метод, для которого доминирующий аргумент является разнородным массивом:
Метод должен быть задан для класса разнородного массива, или непосредственно классом массива или наследованием от суперкласса.
Методом должен быть Sealed = true
(то есть, не может быть заменен подклассом). Если необходимо изолировать унаследованный метод, смотрите Унаследованные методы Изоляции.
Как с гомогенным массивом, класс разнородного массива определяет, какой метод класса выполняется для любого данного вызова метода. MATLAB не рассматривает класс отдельных элементов в массиве при диспетчеризации методам.
Требование, чтобы методы обратились к разнородному массиву быть Sealed = true
, гарантирует правильное и предсказуемое поведение всеми элементами массива.
Вы должны переопределенные методы, которые наследованы снаружи неоднородной иерархии, если этими методами не является Sealed = true
, и вы хотите вызвать эти методы на разнородных массивах.
Например, предположите, что вы задаете разнородный массив путем разделения на подклассы matlab.mixin.SetGet
, в дополнение к matlab.mixin.Heterogeneous
. Замените метод set
, чтобы вызвать метод суперкласса matlab.mixin.SetGet
как требуется вашим проектом класса.
classdef HeterogeneousSetGet < matlab.mixin.SetGet & matlab.mixin.Heterogeneous properties P end methods(Sealed) function varargout = set(obj,varargin) [varargout{1:nargout}] = set@matlab.mixin.SetGet(obj,varargin{:}); end end end
Реализации метода могут использовать в своих интересах то, что, учитывая разнородный массив harray
и скалярный индекс n
, выражение
harray(n)
не разнородный массив. Поэтому при вызове метода на один элемент разнородного массива, особые требования для разнородных массивов не применяются.
При работе с массивами объектов (и неоднородный и гомогенный), MATLAB создает объекты по умолчанию заполнить пропавших без вести элементов массива путем вызова конструктора класса без аргументов. Заполнение пропавших без вести элементов массива становится необходимым в случаях, таких как они:
Индексируемое присвоение, создающее массив с разрывами. Например, если harray
ранее не задан:
harray(5) = LeafA;
Загрузка разнородного массива из MAT-файла, когда MATLAB не может найти определение класса конкретного объекта.
Класс matlab.mixin.Heterogeneous
обеспечивает реализацию по умолчанию метода под названием getDefaultScalarElement
. Этот метод возвращает экземпляр корневого класса неоднородной иерархии, если корневой класс не абстрактен.
Если корневой класс абстрактен или не является соответствующим объектом по умолчанию для классов в неоднородной иерархии, можно заменить метод getDefaultScalarElement
, чтобы возвратить экземпляр класса, который выведен от корневого класса.
Задайте класс объекта по умолчанию путем переопределения метода matlab.mixin.Heterogeneous
под названием getDefaultScalarElement
в корневом классе неоднородной иерархии. Можно заменить getDefaultScalarElement
только в корневом классе.
Метод getDefaultScalarElement
имеет следующую подпись:
methods (Static, Sealed, Access = protected) function defaultObject = getDefaultScalarElement ... end end
Метод getDefaultScalarElement
должен удовлетворить эти критерии:
Статичный — MATLAB вызывает этот метод без объекта.
Защищенный — MATLAB вызывает этот метод; объектные пользователи не делают.
Изолированный (не требуемый) — Изоляция этот метод, чтобы гарантировать пользователям неоднородной иерархии не изменяют намеченное поведение класса.
Это должно возвратить скалярный объект
Его возвращенное значение должно перейти тест isa
для корневого класса, который является
(isa(getDefaultScalarElement,'HierarchyRoot
')
где HierarchyRoot
является именем неоднородного корневого класса иерархии. Это означает, что объект по умолчанию может быть экземпляром любого класса, выведенного от корневого класса.
Разнородные массивы требуют сопоставимых поведений индексации и конкатенации. Поэтому подклассы matlab.mixin.Heterogeneous
не могут изменить свою индексируемую ссылку по умолчанию, индексируемое присвоение или поведение конкатенации.
Вы не можете заменить следующие методы в своих подклассах:
cat
horzcat
vertcat
subsref
subsasgn
В случаях, включающих множественное наследование, в котором ваш подкласс наследовался суперклассам в дополнение к matlab.mixin.Heterogeneous
, суперклассы не могут задать ни один из этих методов.
Операторы формы
a = [obj1 obj2 ...];
создайте массив, a
, содержа объекты, перечисленные в скобках.
Конкатенация объектов Heterogeneous
того же определенного класса сохраняет класс объектов и не формирует разнородный массив.
Конкатенация объектов Heterogeneous
, которые выведены от того же корневого суперкласса, но которые имеют различные определенные классы, приводит к разнородному массиву. MATLAB не пытается преобразовать класс любых участников массивов, если все - часть той же корневой иерархии.
Операторы формы
a(m:n) = [objm ... objn];
присвойте правые объекты стороны элементам массива (m:n
), заданный на левой стороне присвоения.
Индексируемое присвоение на разнородный массив может сделать любой из них:
Увеличьте или уменьшите размер массива.
Перезапишите существующие элементы массива.
Измените значения свойств объектов в массиве.
Измените класс массива.
Изменитесь, неоднороден ли массив.
Операторы формы
a = harray(m:n);
присвойте элементы harray
, на который ссылаются индексы m:n
, чтобы выстроить a
.
Индексируемая ссылка на разнородном массиве возвращает подобласть значений исходного массива. В зависимости от определенных элементов в той подобласти значений (m:n
) результат может иметь различный класс, чем исходный массив и не может быть неоднородным.
При попытке сформировать разнородный массив с объектами, которые не выведены от того же корневого класса, MATLAB вызывает метод convertObject
, если это существует, чтобы преобразовать объекты в доминирующий класс. Реализация метода convertObject
включает формирование разнородных массивов, содержащих объекты, которые не являются частью неоднородной иерархии.
Предположим, что существует два класса A
и B
, где B
не выведен от matlab.mixin.Heterogeneous
, или откуда A
и B
выведены различных корневых классов, которые выведены от matlab.mixin.Heterogeneous
.
MATLAB пытается вызвать метод convertObject
, реализованный полностью класс A
в следующих случаях:
Индексируемое присвоение A(k) = B
Горизонтальные и вертикальные конкатенации [A B] and [A;B]
[A,B] and [A;B]
Реализуйте метод convertObject
, если вы хотите поддержать преобразование объектов, класс которых не задан в вашей неоднородной иерархии. Вы не должны реализовывать этот метод, если ваш проект класса не требует этого преобразования.
Только корневой класс неоднородной иерархии может реализовать метод convertObject
.
Метод convertObject
должен иметь следующую подпись.
methods (Static, Sealed, Access = protected) function cobj = convertObject(DomClass,objToConvert) ... end end
Где для индексируемого присвоения A(k) = B
и конкатенация [A B]
:
DomClass
является именем класса массива A
.
objToConvert
является объектом, который будет преобразован, B
в этом случае.
cobj
является легальным членом неоднородной иерархии, которой принадлежит A
.
convertObject
должен возвратить доступный объект класса, A
или MATLAB выдают ошибку.
Класс matlab.mixin.Heterogeneous
является совместимым указателем. Это может быть объединено или с указателем или с классами значения при определении подкласса с помощью нескольких суперклассов. Смотрите Указатель Совместимые Классы для получения информации о совместимости указателя.
Класс matlab.mixin.Heterogeneous
является классом значения. Чтобы изучить, как классы значения влияют на операции копии, смотрите Копирование Объектов в документации Основ программирования MATLAB.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.