Конструктор класса значений возвращает объект, связанный с переменной, которой он назначен. При переназначении этой переменной MATLAB ® создает независимую копию исходного объекта. Если передать эту переменную функции для ее изменения, функция должна возвратить измененный объект в качестве выходного аргумента. Сведения о поведении класса значений см. в разделе Предотвращение ненужных копий данных.
Конструктор класса дескриптора возвращает объект дескриптора, который является ссылкой на созданный объект. Можно назначить объект-дескриптор нескольким переменным или передать его функциям, не заставляя MATLAB создавать копию исходного объекта. Функция, изменяющая объект-дескриптор, переданный в качестве входного аргумента, не должна возвращать объект.
Все классы дескрипторов являются производными от абстрактного handle класс.
По умолчанию классы MATLAB являются классами значений. Следующее определение создает класс значений с именем MyValueClass:
classdef MyValueClass
...
end
Создание handle класс, выведите класс из 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.Если удалить объект, удалив один из существующих дескрипторов, все копии станут недействительными, так как вы удалили один объект, на который ссылаются все дескрипторы.
Удаление объекта-дескриптора отличается от удаления переменной-дескриптора. В иерархии графических объектов родительский объект содержит ссылку на объект. Например, родительские оси содержат ссылку на объект-линию, на который ссылается 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: 7b
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: 7b
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 =
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 класс позволяет классу:
Наследование нескольких полезных методов (обработка методов классов)
Определение событий и прослушивателей (синтаксис событий и прослушивателей)
Определение динамических свойств (динамические свойства - добавление свойств к экземпляру)
Внедрение методов set и get (реализация интерфейса Set/Get для свойств)
Настройка поведения копирования (реализация копирования для классов дескрипторов)
Дополнительные сведения о классе дескрипторов и его методах см. в разделе Суперкласс дескрипторов.