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

Создание классов та поддержка разнородные массивы

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

Похожие темы

Была ли эта тема полезной?