目录
抽象类和类成员
抽象类
抽象类十分适用于描述一组类所共有的功能,但需要在每个类中有唯一的实现。
抽象类术语:
- 抽象类 - 无法实例化但定义子类使用的类组件的类。
- 抽象成员 - 在抽象类中声明但在子类中实现的属性或方法。
- 具体类 - 可以实例化的类。具体类不包含抽象成员。
- 具体成员 - 由类完全实现的属性或方法。
- 接口 - 一种抽象类,它描述一组类所共有的功能,但需要在每个类中有唯一的实现。抽象类定义每个子类的接口,而不指定实际实现。
- 抽象类作为一组相关子类的基础(即超类)。抽象类可以定义子类实现的抽象属性和方法。每个子类都可以以支持其特定要求的方式实现具体的属性和方法。
实现具体子类
子类必须实现所有继承的抽象属性和方法才能成为具体类。否则,子类本身就是抽象类。
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 属性使用与抽象超类中使用的那些属性相同的值。
-
抽象属性无法定义访问方法,也无法指定初始值。定义具体属性的子类可以创建访问方法并指定初始值。
确定类是否为抽象类
通过查询 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 中定义的两个方法,子类将变为具体类。