Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

抽象类和类成员

抽象类

抽象类十分适用于描述一组类所共有的功能,但需要在每个类中有唯一的实现。

 抽象类术语

抽象类作为一组相关子类的基础(即超类)。抽象类可以定义子类实现的抽象属性和方法。每个子类都可以以支持其特定要求的方式实现具体的属性和方法。

实现具体子类

子类必须实现所有继承的抽象属性和方法才能成为具体类。否则,子类本身就是抽象类。

MATLAB® 不强制子类使用相同签名或属性实现具体方法。

抽象类:

  • 可以定义非抽象的属性和方法

  • 通过继承传递其具体成员

  • 不需要定义任何抽象成员

将类声明为抽象类

当类做出以下声明时为抽象类:

  • 声明 Abstract 类属性

  • 声明抽象方法

  • 声明抽象属性

如果抽象类的子类没有为所有继承的抽象方法或属性定义具体实现,该子类也是抽象类。

抽象类

classdef 语句中将类声明为抽象类:

classdef (Abstract) AbsClass 
   ...
end

对于声明 Abstract 类属性的类:

  • 具体子类必须重新定义声明为抽象的任何属性或方法。

  • 抽象类不需要定义任何抽象方法或属性。

定义任何抽象方法或属性时,MATLAB 会自动将类 Abstract 特性设置为 true

抽象方法

定义抽象方法:

methods (Abstract)
   abstMethod(obj)
end

对于声明 Abstract 方法属性的方法:

  • 不要使用 function...end 代码块来定义抽象方法,只能使用方法签名进行定义。

  • 抽象方法在抽象类中没有实现。

  • 具体子类不需要支持相同数量的输入和输出参数,也不需要使用相同的参数名称。不过,子类在实现其方法版本时通常使用相同的签名。

  • 抽象方法无法定义 arguments 代码块。

抽象属性

定义抽象属性:

properties (Abstract)
   AbsProp
end

对于声明 Abstract 属性特性的属性:

  • 具体子类必须不用 Abstract 特性重新定义抽象属性。

  • 具体子类必须对 SetAccessGetAccess 属性使用与抽象超类中使用的那些属性相同的值。

  • 抽象属性无法定义访问方法,也无法指定初始值。定义具体属性的子类可以创建访问方法并指定初始值。

有关访问方法的详细信息,请参阅属性访问方法

确定类是否为抽象类

通过查询 meta.class 对象的 Abstract 属性,确定类是否为抽象类。例如,AbsClass 定义两个抽象方法:

classdef AbsClass
   methods(Abstract)
      result = absMethodOne(obj)
      output = absMethodTwo(obj)
   end
end

使用 meta.class Abstract 属性的逻辑值来确定类是否为抽象类:

mc = ?AbsClass;
if ~mc.Abstract
   % not an abstract class
end

显示抽象成员名称

使用 meta.abstractDetails 函数显示抽象属性或方法的名称以及定义类的名称:

meta.abstractDetails('AbsClass');
Abstract methods for class AbsClass:
   absMethodTwo   % defined in AbsClass
   absMethodOne   % defined in AbsClass

查找继承的抽象属性和方法

meta.abstractDetails 函数返回您尚未在子类中实现的任何继承的抽象属性或方法的名称和定义类。如果您需要子类是具体类并且必须确定子类继承哪些抽象成员,请使用此函数。

例如,假设您创建在上一节中定义的 AbsClass 类的子类。在本例中,子类只实现 AbsClass 定义的抽象方法之一。

classdef SubAbsClass < AbsClass
% Does not implement absMethodOne
% defined as abstract in AbsClass
   methods
      function out = absMethodTwo(obj)
         ...
      end
   end
end

使用 meta.abstractDetails 确定您是否实现了所有继承的类成员:

meta.abstractDetails(?SubAbsClass)
Abstract methods for class SubAbsClass:
   absMethodOne   % defined in AbsClass

SubAbsClass 类是抽象类,因为它没有实现在 AbsClass 中定义的 absMethodOne 方法。

msub = ?SubAbsClass;
msub.Abstract
ans =

     1

如果您实现了在 AbsClass 中定义的两个方法,子类将变为具体类。

相关主题