exponenta event banner

Сравнение классов дескрипторов и значений

Основная разница

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

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

Все классы дескрипторов являются производными от абстрактного handle класс.

Создание класса значений

По умолчанию классы MATLAB являются классами значений. Следующее определение создает класс значений с именем MyValueClass:

classdef MyValueClass 
   ...
end 

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

Создание handle класс, выведите класс из handle класс.

classdef MyHandleClass < handle
   ...
end 

Поведение встроенных классов MATLAB

Основные классы MATLAB - классы значений (числовые, logical, char, cell, structи дескриптор функции). Например, при создании объекта класса int32 и сделать копию этого объекта, результат будет два независимых объекта. При изменении значения a, значение b не меняется. Такое поведение характерно для классов, представляющих значения.

a = int32(7);
b = a;
a = a^4;
b
   7

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

x = 1:10; y = sin(x);
l1 = line(x,y);
l2 = l1;

Задайте свойства объекта-линии с помощью любой копии дескриптора.

set(l2,'Color','red') 
set(l1,'Color','green') 
get(l2,'Color')
ans =

     0     1     0

Вызов delete функции на l2 дескриптор уничтожает объект линии. При попытке установить Color свойство в строке l1, set функция возвращает ошибку.

delete(l2)
set(l1,'Color','blue')
Error using matlab.graphics.primitive.Line/set
Invalid or deleted object.

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

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

Дополнительные сведения о поведении объектов-дескрипторов см. в разделе Поведение объектов-дескрипторов.

Определяемые пользователем классы значений

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

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

Поведение объекта-значения

Вот класс значений, который хранит значение в своем Number собственность. Значением свойства по умолчанию является число 1.

classdef NumValue
   properties
      Number = 1
   end
end

Создать NumValue объект, назначенный переменной a.

a = NumValue
a = 

  NumValue with properties:

    Number: 1

Присвоить значение a к другой переменной, b.

b = a
b = 

  NumValue with properties:

    Number: 1

Переменные a и b независимы. Изменение значения Number имущество a не влияет на Number имущество b.

a.Number = 7
a = 

  NumValue with properties:

    Number: 7
b
b = 

  NumValue with properties:

    Number: 1

Изменение объектов значений в функциях

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

Дополнительные сведения см. в разделе Изменение объекта.

Определяемые пользователем классы дескрипторов

Экземпляры классов, производные от handle - это ссылки на базовые данные объекта. При копировании объекта-дескриптора MATLAB копирует дескриптор, но не копирует данные, сохраненные в свойствах объекта. Копия ссылается на тот же объект, что и исходный дескриптор. При изменении значения свойства исходного объекта скопированный маркер перемещения ссылается на то же самое изменение.

Поведение объекта-дескриптора

Вот класс дескриптора, который сохраняет значение в своем Number собственность. Значением свойства по умолчанию является число 1.

classdef NumHandle < handle
   properties
      Number = 1
   end
end

Создать NumHandle объекты, назначенные переменной a.

a = NumHandle
a = 

  NumHandle with properties:

    Number: 1

Присвоить значение a к другой переменной, b.

b = a
b = 

  NumHandle with properties:

    Number: 1

Переменные a и b ссылаются на один и тот же базовый объект. Изменение значения Number имущество a также изменяет Number имущество b. То есть a и b см. тот же объект.

a.Number = 7
a = 

  NumHandle with properties:

    Number: 7
b
b = 

  NumHandle with properties:

    Number: 7

Изменение объектов-дескрипторов в функциях

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

Дополнительные сведения см. в разделе Изменение объекта.

Удаление дескрипторов

Объекты-дескрипторы можно уничтожить явным вызовом дескриптора delete способ. Удаление дескриптора объекта класса дескрипторов делает все дескрипторы недопустимыми. Например:

a = NumHandle;
b = a;
delete(a)
b.Number
Invalid or deleted object.

Запрос delete на объекте дескриптора вызывает функцию деструктора или функции для этого объекта. Дополнительные сведения см. в разделе Деструктор класса дескриптора.

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

Сведения о различиях между значениями по умолчанию для свойств инициализации в блоке свойств и свойствами инициализации в конструкторе см. в разделах Инициализация значений свойств и Инициализация массивов объектов-дескрипторов.

Определение равенства объектов

Равенство для объектов значений означает, что объекты относятся к одному классу и имеют одинаковое состояние.

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

Равенство ценностных объектов

Чтобы определить, имеют ли объекты значения одинаковый размер и имеют ли их содержимое одинаковое значение, используйте isequal. Например, используйте ранее определенные NumValue для создания двух экземпляров и проверки равенства:

a = NumValue;
b = NumValue;
isequal(a,b)
ans =

     1

a и b являются независимыми и поэтому не являются одним и тем же объектом. Однако каждый из них представляет одно и то же значение.

При изменении значения, представленного объектом-значением, эти объекты больше не равны.

a = NumValue;
b = NumValue;
b.Number = 7;
isequal(a,b)
ans =

     0

Классы значений не имеют значения по умолчанию eq способ реализации == операция.

Равенство объектов-дескрипторов

Обрабатывать объекты, наследующие eq метод из handle базовый класс. Вы можете использовать == и isequal для проверки двух различных взаимосвязей между объектами-дескрипторами:

  • Маркеры относятся к одному и тому же объекту: == и isequal вернуть true.

  • Дескрипторы относятся к объектам одного класса, которые имеют одинаковые значения, но не являются одинаковыми объектами - только isequal прибыль true.

Использовать ранее определенные NumHandle для создания объекта и копирования дескриптора.

a = NumHandle;
b = a;

Проверка на равенство с использованием == и isequal.

a == b
ans =

     1
isequal(a,b)
ans =

     1

Создание двух экземпляров NumHandle с использованием значений по умолчанию.

a = NumHandle;
b = NumHandle;

Определить, a и b см. тот же объект.

a == b
ans =

     0

Определить, a и b имеют одинаковые значения.

isequal(a,b)
ans =

     1

Функциональные возможности, поддерживаемые классами дескрипторов

Деривация из handle класс позволяет классу:

Дополнительные сведения о классе дескрипторов и его методах см. в разделе Суперкласс дескрипторов.

Связанные темы