Явным образом вызов каждого конструктора суперкласса из конструктора подкласса позволяет:
Передайте аргументы конструкторам суперкласса
Управляйте порядком, в котором MATLAB® вызывает конструкторов суперкласса
Если вы явным образом не вызываете конструкторов суперкласса из конструктора подкласса, 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