Сравнение классов Handle и Value

Основное различие

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

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

Все классы handle получают из абстрактных handle класс.

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

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

classdef MyValueClass 
   ...
end 

Создайте класс Handle

Как создать handle class, выведите класс из 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.

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

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

Для получения дополнительной информации о поведении указателя объектов смотрите Указатель Объекта Behavior.

Пользовательские классы значений

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

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

Поведение объекта указатель

Вот класс handle, который хранит значение в своем 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 способ. Удаление указателя на объект класса Handle делает все указатели недопустимыми. Для примера:

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

Вызывающие delete на указатель объект вызывает функцию или функции деструктора для этого объекта. Для получения дополнительной информации см. Класс Handle Drestructor.

Инициализация свойств, содержащих Указатель Объектов

Для получения информации о различиях между инициализацией свойств до значений по умолчанию в блоке свойств и инициализацией свойств из конструктора, смотрите Инициализация значений свойств и Инициализация массивов Указателя Объектов.

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

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

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

Объекты с равенством значений

Чтобы определить, имеют ли объекты значения одинаковый размер и их содержимое равное значение, используйте 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

Вывод из handle класс позволяет вашему классу:

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

Похожие темы