Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

设计子类构造函数

显式调用超类构造函数

从子类构造函数显式调用每个超类构造函数使您能够:

  • 将参数传递给超类构造函数

  • 控制 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 派生自类 BC 类的构造函数无法调用 A 类的构造函数来初始化属性。类 B 必须初始化类 A 属性。

ABC 的以下实现显示如何在每个类中设计这种关系。

A 定义属性 xy,但只为 x 赋值:

classdef A
   properties
      x
      y
   end
   methods
      function obj = A(x)
         ...
            obj.x = x;
      end
   end
end

B 从类 A 继承属性 xy。类 B 构造函数调用类 A 构造函数以初始化 x,然后为 y 赋值。

classdef B < A
   methods
      function obj = B(x,y)
         ...
         obj@A(x);
         obj.y = y;
      end
   end
end

C 接受属性 xy 的值,并将这些值传递给类 B 构造函数,后者又调用类 A 构造函数:

classdef C < B
   methods
      function obj = C(x,y)
         ...
         obj@B(x,y);
      end
   end
end

相关主题