设计子类构造函数
显式调用超类构造函数
从子类构造函数显式调用每个超类构造函数使您能够:
将参量传递给超类构造函数
控制 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
子类构造函数实现
为了确保类构造函数支持零参量语法,请在调用超类构造函数之前为输入参量变量分配默认值。您无法对超类构造函数的子类调用进行条件化。请将对超类构造函数的调用置于任何条件代码块之外。
例如,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
从类 A
继承属性 x
和 y
。类 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