Явным образом вызов каждого конструктора суперкласса из конструктора подкласса позволяет:
Передайте аргументы конструкторам суперкласса
Управляйте порядком в который MATLAB® вызывает конструкторов суперкласса
Если вы явным образом не вызываете конструкторов суперкласса из конструктора подкласса, 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
Гарантировать, что ваш конструктор класса поддерживает нулевой синтаксис аргументов, значения по умолчанию присвоения к переменным входного параметра прежде, чем вызвать конструктора суперкласса. Вы не можете conditionalize вызов подкласса конструктора суперкласса. Найдите вызовы конструкторов суперкласса вне любых условных блоков кода.
Например, Stocks
конструктор класса не поддерживает случай аргумента с 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