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

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

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

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

  • Всякий раз, когда изменяется определение загруженного класса, 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 метод

  • Переопределение класса 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 применяет изменения к существующим объектам класса.

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

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

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

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

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

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

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

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

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

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

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

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

  • 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 параметры доступа к уведомлениям влияют на доступ к существующим объектам.

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

Похожие темы