Методы конструктора класса

Цель методов конструктора класса

Метод конструктора является специальной функцией, которая создает экземпляр класса. Как правило, методы конструктора принимают, что входные параметры присваивают данные, хранимые в свойствах, и возвращают инициализированный объект.

Для основного примера смотрите Создание Простого Класса.

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);

Инструкции для конструкторов

  • У конструктора есть то же имя как класс.

  • Конструктор может возвратить несколько аргументов, но первый выход должен быть созданным объектом.

  • Если вы не хотите присваивать выходной аргумент, можно очистить переменную объекта в конструкторе (см. Выходной Подавленный Объект).

  • Если вы создаете конструктора класса, гарантируете, что он может быть назван без входных параметров. См. Вызов конструктора без входного аргумента.

  • Если ваш конструктор выполняет явный вызов к конструктору суперкласса, этот вызов должен произойти перед любой другой ссылкой на созданный объект и не может произойти после a 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 событие.

Похожие темы