设计子类构造函数
显式调用超类构造函数
从子类构造函数显式调用每个超类构造函数使您能够:
将参量传递给超类构造函数
控制 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