Поведение объекта

Два поведения копии

Существует два основных вида MATLAB® объекты — указатели и значения.

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

На объекты Handle ссылается их переменная указателя. Копии переменной указателя относятся к тому же объекту. Операции, которые вы выполняете на объекте указателя, отображаются от всех переменных указателя той ссылкой тот объект.

Обработка объектной копии

Если вы задаете классы и хотите поддержать копию объекта указателя, см. Копию Реализации для Классов Handle.

Объект значения копирует поведение

Числовые переменные MATLAB являются объектами значения. Например, когда вы копируете a к переменной b, обе переменные независимы друг от друга. Изменение значения a не изменяет значение b:

a = 8;
b = a;

Теперь повторно присвойте aB неизменно:

a = 6;
b
b =
     8

Очистка a не влияет на b:

clear a
b
b =
     8

Свойства объектов значения

Поведение копии значений, сохраненных как свойства в объектах значения, совпадает с числовыми переменными. Например, предположите vobj1 объект значения со свойством a:

vobj1.a = 8; 

Если вы копируете vobj1 к vobj2, и затем измените значение vobj1 свойство a, значение свойства скопированного объекта, vobj2.a, незатронуто:

vobj2 =vobj1;
vobj1.a = 5;
vobj2.a
ans =
     8

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

Вот класс Handle под названием HdClass это задает свойство под названием Data.

classdef HdClass < handle
   properties
      Data
   end
   methods
      function obj = HdClass(val)
         if nargin > 0
            obj.Data = val;
         end
      end
   end
end

Создайте объект этого класса:

hobj1 = HdClass(8)

Поскольку этот оператор не отключен с точкой с запятой, информацией об отображениях MATLAB об объекте:

hobj1 = 

  HdClass with properties:

    Data: 8

Переменная hobj1 указатель, который ссылается на созданный объект. Копирование hobj1 к hobj2 результаты в другом указателе, относящемся к тому же объекту:

hobj2 = hobj1
hobj2 = 

  HdClass with properties:

    Data: 8

Поскольку указатели ссылаются на объект, копирование указателя копирует указатель на новое имя переменной, но указатель все еще относится к тому же объекту. Например, учитывая, что hobj1 объект указателя со свойством Data:

hobj1.Data
ans =

     8

Измените значение hobj1Data свойство и значение Data скопированного объекта свойство также изменяется:

hobj1.Data = 5;
hobj2.Data
ans =

     5

Поскольку hobj2 и hobj1 указатели на тот же объект, изменяя копию, hobj2, также изменяет данные, вы получаете доступ через указатель к hobj1:

hobj2.Data = 17;
hobj1.Data
ans =

    17

Переприсвоение переменных указателя

Переприсвоение переменной указателя приводит к тому же результату как повторно присваивающий любую переменную MATLAB. Когда вы создаете объект и присваиваете его hobj1:

hobj1 = HdClass(3.14);

hobj1 ссылается на новый объект, не тот же объект, на который ссылаются ранее (и все еще ссылаемый hobj2).

Очистка переменных указателя

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

Учитывая hobj1 и hobj2, которые оба ссылаются на тот же объект, можно очистить любой указатель, не влияя на объект:

hobj1.Data = 2^8;
clear hobj1
hobj2
hobj2 = 

  HdClass with properties:

    Data: 256

Если вы очищаете оба hobj1 и hobj2, затем нет никаких ссылок на объект. MATLAB уничтожает объект и освобождает память, используемую тем объектом.

Удаление объектов указателя

Чтобы удалить объект, на который ссылается любое количество указателей, использовать delete. Учитывая hobj1 и hobj2, который оба отсылают к тому же объекту, удаляют любой указатель. MATLAB удаляет объект:

hobj1 = HdClass(8);
hobj2 = hobj1;
delete(hobj1)
hobj2
hobj2 = 

  handle to deleted HdClass

Использование clear удалить переменную из рабочей области.

Изменение объектов

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

  • Объект Value — функция должна возвратить модифицированную копию объекта. Чтобы изменить объект в рабочей области вызывающей стороны, присвойте функциональный выход переменной того же имени

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

Тестирование на класс указателя или значения

Чтобы определить, является ли объект объектом указателя, используйте isa функция. Если obj объект некоторого класса, этот оператор определяет если obj указатель:

isa(obj,'handle')

Например, containers.Map класс создает объект указателя:

hobj = containers.Map({'Red Sox','Yankees'},{'Boston','New York'});
isa(hobj,'handle')
ans =

     1

hobj также containers.Map объект:

isa(hobj,'containers.Map')
ans =

     1

Запрос класса hobj показывает, что это - containers.Map объект:

class(hobj)
ans =

containers.Map

class функция возвращает определенный класс объекта.

Похожие темы