exponenta event banner

Автоматическое обновление измененных классов

При определении класса нагрузок MATLAB

MATLAB ® загружает определение класса:

  • При первом обращении к классу, например при создании экземпляра, обращении к свойству константы или вызове статического метода класса.

  • При каждом изменении определения загруженного класса MATLAB возвращается в командную строку.

  • При изменении пути MATLAB используется другое определение класса. Изменение вступает в силу после возврата MATLAB в командную строку.

  • При каждом обращении к метаданным класса.

MATLAB допускает существование только одного определения класса в любое время. Поэтому MATLAB пытается автоматически обновить все существующие объекты класса в соответствии с новым определением класса. Вам не нужно звонить clear classes для удаления существующих объектов при изменении их определяющего класса.

Примечание

Использование редактора, отличного от редактора MATLAB, или Online™ MATLAB может привести к задержкам автоматического обновления.

Последствия автоматического обновления

При обновлении существующих объектов MATLAB следует набору основных правил. Автоматическое обновление может привести к следующему:

  • Существующие объекты обновляются до нового определения класса.

  • Ошибка, если MATLAB не может преобразовать объекты в новое определение класса или если имеется ошибка в самом определении класса.

Вот пример того, что происходит при создании экземпляра конкретного класса, редактирующего определение класса, чтобы сделать класс абстрактным.

a = MyClass;
% Edit MyClass to make it Abstract

a
Error using MyClass/display
Cannot update object because the class 'MyClass' is now abstract.

Примечание

MATLAB не обновляет экземпляры метакласса при изменении определения класса. После обновления определения класса необходимо получить новые данные метакласса.

Что происходит при изменении определений классов

MATLAB обновляет существующие объекты при изменении определения класса, включая следующие ситуации:

  • Изменение значения для дескриптора - существующие объекты становятся независимыми дескрипторами, относящимися к различным объектам.

  • Добавлен элемент перечисления - существующие объекты сохраняют элементы перечисления, которые они имели ранее, даже если базовые значения изменились.

  • Элемент перечисления удален - существующие объекты, не использующие удаленный элемент, имеют те же элементы перечисления, что и ранее. Существующие объекты, использующие удаленный элемент, заменяют удаленный элемент элементом перечисления по умолчанию.

  • Блок перечисления удален - элементы перечисления выведены из использования.

  • Определение суперкласса изменено - изменения применены ко всем подклассам в иерархии этого суперкласса.

  • Суперкласс добавлен или удален - изменение суперкласса, примененного ко всем существующим объектам.

Убедитесь, что определение папки остается в области

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

Например, предположим, что класс ввода obj определяется в текущей папке, которая отсутствует в пути. Прежде чем изменить текущую папку на другую, добавьте текущую папку к пути с помощью addpath функция.

function runFromTempFolder(obj)
    % Add current folder to path
    addpath(pwd)
    definingFolder = cd('myTempFolder');
    obj.myMethod;
    cd(definingFolder)
end

Действия, не запускающие обновления

Эти действия не обновляют существующие объекты:

  • Вызов class функция устаревшего объекта

  • Назначение устаревшего объекта переменной

  • Вызов метода, не имеющего доступа к данным класса

  • Изменение проверки свойств в определении класса (проверка значений свойств)

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

Несколько обновлений определений классов

Обновления не выполняются постепенно. Обновления соответствуют последней версии класса.

Действительность объекта с удаленным файлом класса

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

Когда обновления невозможны

Некоторые обновления класса приводят к неверному определению класса. В этих случаях объекты не обновляются до устранения ошибки:

  • Добавление суперкласса может привести к двойному определению свойства или метода.

  • Изменение суперкласса на Sealed если объекты одного из его подклассов существуют, это приводит к неверному определению подкласса.

Некоторые обновления классов приводят к ситуациям, когда MATLAB не может обновить существующие объекты, чтобы они соответствовали измененному определению класса. Эти случаи приводят к ошибкам до удаления объектов:

  • Добавление блока перечисления в класс, не являющийся классом перечисления

  • Переопределение абстрактного класса

  • Удаление класса из гетерогенной иерархии приводит к отсутствию объекта по умолчанию для замены существующих объектов в гетерогенном массиве

  • Обновление класса для ограничения поведения формирования массива, например, перегрузки индексации и конкатенации массива.

  • Наследование subsref, subsasgn, cat, vertcat, или horzcat метод

  • Переопределение класса дескриптора как класса значений.

Потенциальные последствия обновления классов

  • После обновления существующие объекты могут быть несовместимы с новым определением класса. Например, для вновь добавленного свойства может потребоваться выполнение конструктора.

  • Удаление или переименование свойств может привести к потере данных, содержащихся в свойстве. Например, если свойство содержит единственную ссылку на другой объект и это свойство удаляется из класса, MATLAB удаляет объект, поскольку на него больше нет ссылок.

  • Удаление класса из гетерогенной иерархии классов может привести к появлению недопустимых элементов гетерогенного массива. В этом случае объект по умолчанию для гетерогенной иерархии заменяет эти элементы массива.

Взаимодействие с отладчиком

С R2021a года.

MATLAB отключает отладчик во время обновления класса. Перед R2021a точка останова может потенциально прервать процесс обновления класса и разрешить введение ошибок при возобновлении обновления.

Например, этот класс определяет функцию проверки свойств:

classdef ClassWithBreakpoint
    properties (Constant)
        Prop1 (1,1) {myPropertyValidator}
    end
end

function myPropertyValidator(~)
end % Add breakpoint here
Создайте экземпляр этого класса. Затем добавьте точку останова, где указано, и обновите определение Prop1 для включения начального значения:
Prop1 (1,1) {myPropertyValidator} = 32
В версии R2020b и более ранних MATLAB достигает точки останова, и обновление класса прерывается. В R2021a отладчик отключен, и точка останова не прерывает обновление.

Обновления атрибутов класса

Изменение атрибутов класса может изменить существующее поведение объекта или сделать объекты недопустимыми. MATLAB возвращает ошибку при доступе к недопустимым объектам.

ИзменениеЭффект

Сделать Abstract = true

При доступе к существующим объектам возвращается ошибка.

Изменение AllowedSubclasses

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

Изменение ConstructOnLoad

Загрузка классов подчиняется текущему значению ConstructOnLoad.

Изменение HandleCompatible

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

Изменение Hidden

Появление класса в списке суперклассов и доступ по help функция может изменяться

Изменение InferiorClasses

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

Сделать Sealed = true

Существующие объекты подкласса возвращают ошибки при обращении.

Обновления определений свойств

При изменении определения свойств класса MATLAB применяет изменения к существующим объектам класса.

ИзменениеЭффект

Добавить свойство

Добавляет новое свойство к существующим объектам класса. Устанавливает значения свойств по умолчанию (т. е. [] если в определении класса не указано значение по умолчанию).

Удалить свойство

Удаляет свойство из существующих объектов класса. Не удалось получить доступ к удаленному свойству.

Изменение значения свойства по умолчанию

Не применяет новое значение по умолчанию к существующим объектам класса.

Переместить свойство между подклассом и суперклассом

Не применяет другое значение по умолчанию при перемещении определения свойства между суперклассом и подклассом.

Изменение значения атрибута свойства

Применяет изменения к существующим объектам класса.

В некоторых случаях требуются переходные шаги:

  • Abstract - Существующие объекты класса, которые становятся абстрактными, не могут быть обновлены. Удалите эти объекты.

  • Access - Изменения в public, protected, или private параметры доступа к свойствам влияют на доступ к существующим объектам.

    Изменения списков доступа не изменяют существующие объекты. Однако при добавлении классов в список доступа экземпляры этих классов имеют доступ к этому свойству. При удалении классов из списка доступа объекты этих классов больше не имеют доступа к этому свойству.

  • Dependent - При изменении на trueсуществующие объекты больше не хранят значения свойств. Если требуется запросить значение свойства, добавьте метод получения свойства для свойства.

  • Transient - При изменении на true, объекты уже сохранены, перезагрузите это значение свойства. При изменении на false, объекты, уже сохраненные, перезагружают это свойство с использованием значения по умолчанию.

Обновление определений методов

При изменении определения методов классов MATLAB изменяет соответствующий элемент класса в существующих объектах следующим образом.

ИзменениеЭффект

Добавить метод

Новый метод можно вызвать для существующих объектов класса.

Изменить метод

Изменения доступны для существующих объектов.

Удалить метод

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

Изменение значения атрибута метода

Применить изменения к существующим объектам класса.

В некоторых случаях требуются переходные шаги:

  • Abstract - Существующие объекты класса, которые становятся абстрактными, не могут быть обновлены. Удалите эти объекты.

  • Access - Изменения в методе public, protected, или private параметры доступа влияют на доступ к существующим объектам.

    Изменения списков доступа не изменяют существующие экземпляры. Однако при добавлении классов в список доступа экземпляры этих классов имеют доступ к этому методу. При удалении классов из списка доступа объекты этих классов больше не имеют доступа к этому методу.

  • Sealed - При изменении на true и существующие подклассы уже определили метод, MATLAB возвращает ошибку, поскольку новое определение класса не может быть применено к существующим подклассам.

Обновления определений событий

ИзменениеЭффект

Добавить событие

Существующие объекты класса поддерживают новое событие.

Изменить имя события

Новое имя события отображается для существующих объектов класса. MATLAB:

  • Не обновляет существующие объекты метакласса

  • Обновляются ли вновь полученные объекты метакласса

  • Не обновляет прослушиватели для использования нового имени события

Удалить событие

Существующие объекты больше не поддерживают удаленное событие.

Изменить значение атрибута события

Применить изменения к существующим объектам класса.

В некоторых случаях требуются переходные шаги:

  • ListenAccess - Изменения в событии public, protected, или private Параметры прослушивания доступа влияют на доступ к существующим объектам.

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

  • NotifyAccess - Изменения в событии public, protected, или private параметры доступа к уведомлению влияют на доступ к существующим объектам.

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

Связанные темы