Явный вызов каждого конструктора суперкласса из конструктора подкласса позволяет вам:
Передайте аргументы конструкторам суперкласса
Управление порядком, в котором 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
Subclass Constructors предоставляет дополнительные сведения о создании методов конструктора подкласса.
Если суперкласс содержится в пакете, включите имя пакета. Для примера, 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
конструктор классов поддерживает случай отсутствия аргументов со 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