Автоматические обновления для модифицированных классов

Когда MATLAB загружает определения классов

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

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

  • Каждый раз, когда определение загруженного класса изменяется, и MATLAB возвращается к командной строке.

  • Когда вы изменяете путь MATLAB и заставляете различное определение класса использоваться. Изменение вступает в силу после того, как MATLAB возвращается к командной строке.

  • Каждый раз, когда вы получаете доступ к метаданным класса.

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

Примечание

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

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

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 обновляет существующие объекты, когда определение класса изменяется, включая следующие ситуации:

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

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

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

  • Удаленный блок Enumeration — члены Перечисления вынут из использования.

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

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

Гарантируйте, что папка определения остается в осциллографе

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

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

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

Действия, которые не инициировали обновления

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

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

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

  • Вызов метода, который не получает доступ к данным о классе

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

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

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

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

Объектная законность с удаленным файлом класса

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

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

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

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

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

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

  • Добавление перечисления блокируется к классу неперечисления

  • Переопределение класса, чтобы быть абстрактным

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

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

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

  • Переопределение класса Handle, чтобы быть классом значения.

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

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

  • Удаление или переименование свойств могут потерять данные, сохраненные в свойстве. Например, если свойство содержит единственную ссылку на другой объект, и вы удаляете то свойство из класса, 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 применяет изменения в существующих объектах класса.

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

Addproperty

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

Свойство Remove

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Модификации доступны для существующих объектов.

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

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

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

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

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

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

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

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

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

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

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

Addevent

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

Поменяйте имя события

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

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

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

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

Событие Remove

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

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

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

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

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

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

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

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

Похожие темы