指定允许的子类
基本知识
本节介绍的材料建立在对以下信息的理解之上:
为什么控制允许子类
类定义可以指定允许作为子类的类列表。不在列表中的类不能定义为该类的子类。要指定允许的子类,使用AllowedSubclasses
类属性。
的AllowedSubclasses
属性之间提供设计点密封
类(不允许子类化)和默认行为(不限制子类化)。
通过控制允许的子类,您可以创建一个密封的类层次结构。也就是说,一个类系统允许特定的类集从特定的基类派生,但不允许无限制的子类化。
看到定义类的密封层次结构有关此技术的更多信息。
指定允许的子类
类中指定一个或多个允许的子类的列表classdef
赋值语句meta.class
反对AllowedSubclasses
属性。创建meta.class
对象引用特定的类?
操作符和类名:
classdefAllowedSubclasses = ?类名称) MySuperClass…结束
使用单元格数组meta.class
对象来定义一个以上允许的子类:
classdefAllowedSubclasses = {?ClassName1,?ClassName2,……?ClassNameN}) MySuperClass…结束
在引用类名时始终使用完全限定类名:
classdefAllowedSubclasses = ?Package.SubPackage.ClassName1) MySuperClass…结束
将空单元格数组赋值给AllowedSubclasses
属性实际上与定义密封
类。
classdef(AllowedSubclasses = {}) MySuperClass…结束
请注意
只使用?
操作符和要生成的类名meta.class
对象。的值。AllowedSubclasses
属性不能包含任何其他MATLAB®表达式,包括返回两者之一的函数meta.class
的对象或单元格数组meta.class
对象。
声明允许子类的结果
的列表中包含一个类AllowedSubclasses
不将该类定义为子类,也不要求您将该类定义为子类。它只允许被引用的类被定义为子类。
将一个类声明为允许的子类并不影响这个类本身是否可以被子类化。
类定义可以包含对AllowedSubclasses
属性,引用当前未定义或在MATLAB路径上可用的类。但是,MATLAB在加载类时无法找到的任何引用子类都将有效地从列表中删除,而不会引起错误或警告。
请注意
如果MATLAB没有在允许类列表中找到任何类,则该类是有效的密封
。密封类相当于AllowedSubclasses = {}
。
使用meta.class
财产RestrictsSubclassing
来确定一个类是否密封
或指定AllowedSubclasses
。
定义类的密封层次结构
的AllowedSubclasses
属性使您能够通过密封允许的子类来定义密封的类层次结构:
classdef(AllowedSubclasses = {?SubClass1,?SubClass2}…结束
将允许的子类定义为密封
:
classdef(密封)SubClass1…结束classdef(密封)SubClass2…结束
密封的类层次结构使您能够在维护封闭的类系统的同时使用设计所需的抽象级别。