Явный вызов каждого конструктора суперкласса из конструктора подкласса позволяет:
Передача аргументов конструкторам суперкласса
Управление порядком, в котором MATLAB ® вызывает конструкторы суперкласса
Если конструкторы суперкласса явно не вызываются из конструктора подкласса, MATLAB неявно вызывает эти конструкторы без аргументов. Конструкторы суперкласса должны поддерживать синтаксис no argument для поддержки неявных вызовов.
MATLAB не гарантирует определенного порядка вызова при наличии нескольких суперклассов. Если важен порядок, в котором MATLAB вызывает конструкторы суперкласса, вызовите конструкторы суперкласса явно из конструктора подкласса.
Если конструктор подкласса не определен, можно вызвать конструктор по умолчанию с аргументами суперкласса. Дополнительные сведения см. в разделах Конструктор по умолчанию и неявный вызов унаследованного конструктора.
Чтобы вызвать конструктор для каждого суперкласса в конструкторе подкласса, используйте следующий синтаксис:
obj@SuperClass1(args,...);
...
obj@SuperclassN(args,...);
Где obj - вывод конструктора подкласса, SuperClass... - имя суперкласса, и args - любые аргументы, требуемые соответствующим конструктором суперкласса.
Например, следующий сегмент определения класса показывает, что класс вызывается Stocks это подкласс класса с именем Assets.
classdef Stocks < Assets methods function s = Stocks(asset_args,...) if nargin == 0 % Assign values to asset_args end % Call asset constructor s@Assets(asset_args); ... end end end
Конструкторы подкласса предоставляют дополнительные сведения о создании методов конструктора подкласса.
Если в пакете содержится суперкласс, укажите имя пакета. Например, Assests класс находится в finance пакет:
classdef Stocks < finance.Assets methods function s = Stocks(asset_args,...) if nargin == 0 ... end % Call asset constructor s@finance.Assets(asset_args); ... end end end
Чтобы вывести класс из нескольких суперклассов, инициализируйте объект подкласса вызовами каждого конструктора суперкласса:
classdef Stocks < finance.Assets & Taxable methods function s = Stocks(asset_args,tax_args,...) if nargin == 0 ... end % Call asset and member class constructors s@finance.Assets(asset_args) s@Taxable(tax_args) ... end end end
Чтобы гарантировать, что конструктор класса поддерживает синтаксис нулевых аргументов, назначьте значения по умолчанию переменным входных аргументов перед вызовом конструктора суперкласса. Нельзя обусловить вызов подкласса конструктором суперкласса. Найдите вызовы конструкторов суперкласса вне любых блоков условного кода.
Например, Stocks конструктор класса поддерживает регистр no argument с if оператор, но вызывает конструктор суперкласса вне if кодовый блок.
classdef Stocks < finance.Assets properties NumShares Symbol end methods function s = Stocks(description,numshares,symbol) if nargin == 0 description = ''; numshares = 0; symbol = ''; end s@finance.Assets(description); s.NumShares = numshares; s.Symbol = symbol; end end end
Вызовите только конструкторы прямого суперкласса из конструктора подкласса. Например, предположим, что класс B извлекается из класса A и класс C извлекается из класса B. Конструктор для класса C не удается вызвать конструктор для класса A для инициализации свойств. Класс B должен инициализировать класс A свойства.
Следующие реализации классов A, B, и C показать, как создать эту связь в каждом классе.
Класс A определяет свойства x и y, но присваивает значение только x:
classdef A properties x y end methods function obj = A(x) ... obj.x = x; end end end
Класс B наследует свойства x и y из класса A. Класс B конструктор вызывает класс A конструктор для инициализации x а затем присваивает значение y.
classdef B < A methods function obj = B(x,y) ... obj@A(x); obj.y = y; end end end
Класс C принимает значения для свойств x и y, и передает эти значения в класс B конструктор, который в свою очередь вызывает класс A конструктор:
classdef C < B methods function obj = C(x,y) ... obj@B(x,y); end end end