Метод конструктора является специальной функцией, которая создает экземпляр класса. Как правило, методы конструктора принимают, что входные параметры присваивают данные, хранимые в свойствах, и возвращают инициализированный объект.
Для основного примера смотрите, Создают Простой Класс.
Все классы MATLAB® имеют метод конструктора по умолчанию. Этот метод возвращает объект класса, который создается без входных параметров. Класс может задать метод конструктора, который заменяет конструктора по умолчанию. Явным образом заданный конструктор может принять входные параметры, инициализировать значения свойств, вызвать другие методы и выполнить другие операции, необходимые, чтобы создать объекты класса.
Методы конструктора могут быть структурированы в три основных раздела:
Предварительная инициализация — аргументы Compute для конструкторов суперкласса.
Объектная инициализация — конструкторы суперкласса Вызова.
Отправьте инициализацию — Выполняют любые операции, связанные с подклассом, включая ссылку и присвоение объекту, вызывают методы класса, передача объекта к функциям, и так далее.
Этот код иллюстрирует основные операции, выполняемые в каждом разделе:
classdef ConstructorDesign < BaseClass1 properties ComputedValue end methods function obj = ConstructorDesign(a,b,c) %% Pre Initialization %% % Any code not using output argument (obj) if nargin == 0 % Provide values for superclass constructor % and initialize other inputs a = someDefaultValue; args{1} = someDefaultValue; args{2} = someDefaultValue; else % When nargin ~= 0, assign to cell array, % which is passed to supclass constructor args{1} = b; args{2} = c; end compvalue = myClass.staticMethod(a); %% Object Initialization %% % Call superclass constructor before accessing object % You cannot conditionalize this statement obj = obj@BaseClass1(args{:}); %% Post Initialization %% % Any code, including access to object obj.classMethod(arg); obj.ComputedValue = compvalue; ... end ... end ... end
Вызовите конструктора как любая функция, передающие аргументы и возврат объекта класса.
obj = ConstructorDesign(a,b,c);
У конструктора есть то же имя как класс.
Конструктор может возвратить несколько аргументов, но первый вывод должен быть созданным объектом.
Если вы не хотите присваивать выходной аргумент, можно очистить переменную объекта в конструкторе (см. Выходной Подавленный Объект).
Если вы создаете конструктора класса, гарантируете, что он может быть назван без входных параметров. См. Вызов конструктора без входного аргумента.
Если ваш конструктор выполняет явный вызов к конструктору суперкласса, этот вызов должен произойти перед любой другой ссылкой на созданный объект и не может произойти после оператора return
.
Вызовы конструкторов суперкласса не могут быть условным выражением. Вы не можете поместить вызовы конструкции суперкласса в циклы, условия, переключатели, пробовать/отлавливать, или вложенные функции. Не смотрите Условные Вызовы Конструкторов суперкласса для получения дополнительной информации.
Если класс не задает конструктора, MATLAB предоставляет конструктора по умолчанию, который не берет аргументов и возвращает скалярный объект, свойства которого инициализируются к значениям свойства по умолчанию. Конструктор по умолчанию, предоставленный MATLAB также, вызывает всех конструкторов суперкласса без аргументов или с любым аргументом, переданным конструктору подкласса по умолчанию.
Когда подкласс не задает конструктора, конструктор по умолчанию передает свои входные параметры прямому конструктору суперкласса. Это поведение полезно, когда нет никакой потребности в подклассе, чтобы задать конструктора, но конструктор суперкласса действительно требует входных параметров.
Задайте метод конструктора выполнить объектную инициализацию, которую не может выполнить конструктор по умолчанию. Например, когда создание объекта класса требует:
Входные параметры
Инициализируя объектное состояние, такое как значения свойств, для каждого экземпляра класса
Вызов конструктора суперкласса со значениями, которые определяются конструктором подкласса
Для получения информации характерный для построения перечислений, смотрите Вызывающую последовательность Конструктора класса Перечисления.
Для получения информации о создании массивов объектов в конструкторе смотрите Массивы объектов Построения.
Если создаваемый класс является подклассом, MATLAB вызывает конструктора каждого класса суперкласса, чтобы инициализировать объект. Неявные вызовы конструктора суперкласса выполняются без аргументов. Если конструкторы суперкласса требуют аргументов, вызовите их из конструктора подкласса явным образом. Смотрите Управляющую последовательность Вызовов Конструктора
Методы конструктора возвращают инициализированный объект как выходной аргумент. Выходной аргумент задан, когда конструктор выполняется, прежде, чем выполнить первую строку кода.
Например, следующий конструктор может присвоить значение свойства A
объекта как первый оператор, потому что объект obj
был уже присвоен экземпляру MyClass
.
function obj = MyClass(a,b,c) obj.A = a; ... end
Можно вызвать другие методы класса от конструктора, потому что объект уже инициализируется.
Конструктор также создает объект, свойства которого имеют свои значения по умолчанию — или пустой ([]
) или значение по умолчанию, заданное в блоке определения свойства.
Например, этот конструктор работает с входными параметрами, чтобы присвоить значение свойства Value
.
function obj = MyClass(a,b,c) obj.Value = (a + b) / c; ... end
Когда инициализация объекта, например, путем присвоения значений свойствам, использует имя выходного аргумента, чтобы относиться к объекту в конструкторе. Например, в следующем коде выходным аргументом является obj
, и объект является ссылкой как obj
:
% obj is the object being constructed function obj = MyClass(arg) obj.propert1 = arg*10; obj.method1; ... end
Для получения дополнительной информации об определении значений свойств по умолчанию смотрите Значения свойства по умолчанию.
Существуют случаи, где конструктор должен смочь быть названным без входного параметра:
Когда загружаемые объекты в рабочую область, если класс атрибут ConstructOnLoad
установлен в true
, вызовы функции load
конструктор класса без аргументов.
При создании или расширении объектного массива, таким образом, что не всем элементам дают определенные значения, конструктор класса называется без аргументов, чтобы заполнить незаданные элементы (например, x(10,1) = MyClass(a,b,c);
). В этом случае конструктор называется однажды без аргументов, чтобы заполнить элементы пустого массива (x(1:9,1)
) с копиями этого объекта.
Если нет никаких входных параметров, конструктор создает объект с помощью только значения свойств по умолчанию. Хорошая практика должна добавить проверку на нулевые аргументы к конструктору класса, чтобы предотвратить ошибку, если любой из этих двух случаев происходит:
function obj = MyClass(a,b,c) if nargin > 0 obj.A = a; obj.B = b; obj.C = c; ... end end
Для способов обработать конструкторов суперкласса, смотрите Базовую структуру Методов конструктора.
Конструкторы подкласса могут вызвать конструкторов суперкласса явным образом, чтобы передать аргументы конструктору суперкласса. Конструктор подкласса должен задать эти аргументы в вызове конструктора суперкласса и должен использовать выходной аргумент конструктора, чтобы сформировать вызов. Вот синтаксис:
classdef MyClass < SuperClass methods function obj = MyClass(a,b,c,d) obj@SuperClass(a,b); ... end end end
Конструктор подкласса должен выполнить все вызовы к конструкторам суперкласса перед любыми другими ссылками на объект (obj
). Это ограничение включает значения свойств присвоения или вызов обычных методов класса. Кроме того, конструктор подкласса может вызвать конструктора суперкласса только однажды.
Если classdef
не задает класс как суперкласс, конструктор не может вызвать конструктора суперкласса с этим синтаксисом. Таким образом, конструктор подкласса может вызвать только прямых конструкторов суперкласса, перечисленных в строке classdef
.
classdef MyClass < SuperClass1 & SuperClass2
MATLAB призывает любых невостребованных конструкторов слева направо порядок, в котором они заданы в строке classdef
. MATLAB не передает аргументов с этими вызовами.
Вызовы конструкторов суперкласса должны быть безусловными. Может быть, только один призывает к данному суперклассу. Инициализируйте фрагмент суперкласса объекта путем вызова конструкторов суперкласса перед использованием объекта (например, чтобы присвоить значения свойств или вызвать методы класса).
Чтобы вызвать конструктора суперкласса с различными аргументами, которые зависят от некоторого условия, создайте массив ячеек аргументов и предоставьте один вызов конструктору.
Например, конструктор класса Cube
вызывает суперкласс конструктор Shape
, использующий значения по умолчанию, когда конструктор Cube
называется без аргументов. Если конструктор Cube
вызван четырьмя входными параметрами, то передайте upvector
и viewangle
к конструктору суперкласса:
classdef Cube < Shape properties SideLength = 0 Color = [0 0 0] end methods function cubeObj = Cube(length,color,upvector,viewangle) % Assemble superclass constructor arguments if nargin == 0 super_args{1} = [0 0 1]; super_args{2} = 10; elseif nargin == 4 super_args{1} = upvector; super_args{2} = viewangle; else error('Wrong number of input arguments') end % Call superclass constructor cubeObj@Shape(super_args{:}); % Assign property values if provided if nargin > 0 cubeObj.SideLength = length; cubeObj.Color = color; end ... end ... end end
Чтобы поддержать синтаксис, который вызывает конструктора суперкласса без аргументов, обеспечьте этот синтаксис явным образом.
Предположим в случае примера класса Cube
, всем значениям свойств в суперклассе Shape
и подклассе Cube
задали значения по умолчанию в определениях классов. Затем можно создать экземпляр Cube
, не задавая аргументов для суперкласса или конструкторов подкласса.
Вот то, как можно реализовать это поведение в конструкторе Cube
:
methods function cubeObj = Cube(length,color,upvector,viewangle) % Assemble superclass constructor arguments if nargin == 0 super_args = {}; elseif nargin == 4 super_args{1} = upvector; super_args{2} = viewangle; else error('Wrong number of input arguments') end % Call superclass constructor cubeObj@Shape(super_args{:}); % Assign property values if provided if nargin > 0 cubeObj.SideLength = length; cubeObj.Color = color; end ... end end
См. Конструкторов подкласса Проекта для получения информации о создании подклассов.
MATLAB передает аргументы неявно от конструктора подкласса по умолчанию до конструктора суперкласса. Это поведение избавляет от необходимости реализовывать метод конструктора для подкласса только, чтобы передать аргументы конструктору суперкласса.
Например, следующий конструктор класса требует одного входного параметра (объект datetime
), который конструктор присваивает свойству CurrentDate
.
classdef BaseClassWithConstr properties CurrentDate datetime end methods function obj = BaseClassWithConstr(dt) obj.CurrentDate = dt; end end end
Предположим, что вы создаете подкласс BaseClassWithConstr
, но ваш подкласс не требует метода явного конструктора.
classdef SubclassDefaultConstr < BaseClassWithConstr ... end
Можно создать объект SubclassDefaultConstr
путем вызова его конструктора по умолчанию с аргументом суперкласса:
obj = SubclassDefaultConstr(datetime);
Для получения информации о конструкторах подкласса см. Конструкторов подкласса и Конструктора по умолчанию.
Для классов Handle MATLAB вызывает метод delete
, когда ошибка происходит при следующих условиях:
Ссылка на объект присутствует в коде до ошибки.
Ранний оператор return
присутствует в коде перед ошибкой.
MATLAB вызывает метод delete
на объекте, методы delete
для любых объектов, содержавшихся в свойствах и методах delete
для любых инициализированных базовых классов.
В зависимости от того, когда происходит ошибка, MATLAB может вызвать деструктор класса, прежде чем объект будет полностью создан. Поэтому методы delete
класса должны смочь работать с частично созданными объектами, которые не могут иметь значений для всех свойств. Для получения дополнительной информации смотрите Разрушение Поддержки Частично Созданных Объектов.
Для получения информации о том, как объекты уничтожаются, видят Деструктор Класса Handle.
Можно подавить присвоение экземпляра класса к переменной ans
, когда никакая выходная переменная не присвоена в вызове конструктора. Этот метод полезен для приложений, который создает окна графического интерфейса, которые содержат на созданные объекты. Эти приложения не должны возвращать объект.
Используйте nargout
, чтобы определить, был ли конструктор вызван выходным аргументом. Например, конструктор класса для класса MyApp
очищает переменную объекта, obj
, если названо без присвоенного вывода:
classdef MyApp methods function obj = MyApp ... if nargout == 0 clear obj end end ... end end
Когда конструктор класса не возвращает объект, MATLAB не инициировал событие meta.class
InstanceCreated
.