Конструктор класса 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: 7
b
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: 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 Methods)
Задайте события и прослушиватели (синтаксис событий и прослушивателей)
Определите динамические свойства (Динамические Свойства - Добавляющие Свойства к Образцу)
Реализуйте методы set и get (Implement Set/Get Interface for Properties)
Настройка поведения копирования (Реализация копирования для классов Handle)
Дополнительные сведения о классе Handle и его методах см. в разделе Суперкласс указателя.