抽象类和类成员
抽象类
抽象类十分适用于描述一组类所共有的功能,但需要在每个类中有唯一的实现。
抽象类作为一组相关子类的基础(即超类)。抽象类可以定义子类实现的抽象属性和方法。每个子类都可以以支持其特定要求的方式实现具体的属性和方法。
实现具体子类
子类必须实现所有继承的抽象属性和方法才能成为具体类。否则,子类本身就是抽象类。
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
特性重新定义抽象属性。具体子类必须对
SetAccess
和GetAccess
属性使用与抽象超类中使用的那些属性相同的值。抽象属性无法定义访问方法,也无法指定初始值。定义具体属性的子类可以创建访问方法并指定初始值。
有关访问方法的详细信息,请参阅属性 get 和 set 方法。
确定类是否为抽象类
通过查询 matlab.metadata.Class
对象的 Abstract
属性,确定类是否为抽象类。例如,AbsClass
定义两个抽象方法:
classdef AbsClass methods(Abstract) result = absMethodOne(obj) output = absMethodTwo(obj) end end
使用 matlab.metadata.Class
Abstract
属性的逻辑值来确定类是否为抽象类:
mc = ?AbsClass; if ~mc.Abstract % not an abstract class end
显示抽象成员名称
使用 matlab.metadata.abstractDetails
函数显示抽象属性或方法的名称以及定义类的名称:
matlab.metadata.abstractDetails('AbsClass');
Abstract methods for class AbsClass: absMethodTwo % defined in AbsClass absMethodOne % defined in AbsClass
查找继承的抽象属性和方法
matlab.metadata.abstractDetails
函数返回您尚未在子类中实现的任何继承的抽象属性或方法的名称和定义类。如果您需要子类是具体类并且必须确定子类继承哪些抽象成员,请使用此函数。
例如,假设您创建在上一节中定义的 AbsClass
类的子类。在本例中,子类只实现 AbsClass
定义的抽象方法之一。
classdef SubAbsClass < AbsClass % Does not implement absMethodOne % defined as abstract in AbsClass methods function out = absMethodTwo(obj) ... end end end
使用 matalb.metadata.abstractDetails
确定您是否实现了所有继承的类成员:
matlab.metadata.abstractDetails(?SubAbsClass)
Abstract methods for class SubAbsClass: absMethodOne % defined in AbsClass
SubAbsClass
类是抽象类,因为它没有实现在 AbsClass
中定义的 absMethodOne
方法。
msub = ?SubAbsClass; msub.Abstract
ans = 1
如果您实现了在 AbsClass
中定义的两个方法,子类将变为具体类。