Конструктор класса value возвращает объект, который связан с переменной, которой он назначен. Если вы переназначили эту переменную, MATLAB® создает независимую копию исходного объекта. Если вы передаете эту переменную в функцию, чтобы изменить ее, функция должна вернуть измененный объект в качестве выходного аргумента. Для получения информации о поведении класса ценности см. «Избегайте ненужных копий данных».
Конструктор класса handle возвращает объект указателя, являющийся ссылкой на созданный объект. Можно назначить объект указатель нескольким переменным или передать его функциям, не заставляя MATLAB создавать копию исходного объекта. Функция, которая изменяет объект указателя, переданный как входной параметр, не должна возвращать объект.
Все классы handle получают из абстрактных handle класс.
По умолчанию классы MATLAB являются классами значений. Следующее определение создает класс значений с именем MyValueClass:
classdef MyValueClass
...
end
Как создать handle class, выведите класс из handle класс.
classdef MyHandleClass < handle
...
end
Фундаментальными классами 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: 7b
b =
NumValue with properties:
Number: 1Когда вы передаете объект значения функции, MATLAB создает копию этого объекта в рабочей области функции. Поскольку копии объектов значения являются независимыми, функция не изменяет объект в рабочей области вызывающего абонента. Поэтому функции, которые изменяют объекты значения, должны вернуть измененный объект, который будет переназначен в рабочей области вызывающего абонента.
Дополнительные сведения см. в разделе Изменение объекта.
Образцы классов, которые получают из 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: 7b
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 =
1a и 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 =
1isequal(a,b)
ans =
1Создайте два образцов NumHandle класс с использованием значений по умолчанию.
a = NumHandle; b = NumHandle;
Определите, a и b обратитесь к тому же объекту.
a == b
ans =
0Определите, a и b иметь одинаковые значения.
isequal(a,b)
ans =
1Вывод из handle класс позволяет вашему классу:
Наследовать несколько полезных методов (Класс Handle Methods)
Задайте события и прослушиватели (синтаксис событий и прослушивателей)
Определите динамические свойства (Динамические Свойства - Добавляющие Свойства к Образцу)
Реализуйте методы set и get (Implement Set/Get Interface for Properties)
Настройка поведения копирования (Реализация копирования для классов Handle)
Дополнительные сведения о классе Handle и его методах см. в разделе Суперкласс указателя.