Swift 5+不支持多类继承,如何同时继承自定义基类与系统类?
解决方案
Swift 不支持多类继承,针对你的场景可以采用以下3种常用实现思路:
方案1:使用带默认实现的协议替代自定义继承链(最适配RealityKit/ARKit场景)
RealityKit本身的设计就是面向协议的组件化架构,你可以把原本shape、box类的属性、方法全部封装到协议中,通过协议扩展提供默认实现,业务类只需要遵守协议 + 继承系统需要的父类即可:
// 把原shape类的能力封装为协议 protocol ShapeType { var mType: String { get set } } // 把原box类的能力封装为协议 protocol BoxType: ShapeType { var mWidth: Int { get set } var mHeight: Int { get set } } // 业务类直接继承系统类,只需要遵守自定义协议即可 class CustomObject: Entity, HasModel, HasCollision, BoxType { // 实现自定义协议要求的属性即可,也可以通过关联对象给协议扩展加存储属性支持,减少重复实现 var mType: String = "" var mWidth: Int = 0 var mHeight: Int = 0 var someStuff: String = "" }
方案2:使用组合模式替代继承
优先使用组合而非继承是Swift官方推荐的设计思路,直接在需要继承系统类的业务类中持有自定义基类的实例,而非继承自定义基类:
class CustomObject: Entity, HasModel, HasCollision { // 持有自定义box实例,而非继承 let box: Box var someStuff: String = "" init(box: Box) { self.box = box } } // 可通过扩展加计算属性简化原属性的访问路径 extension CustomObject { var mType: String { get { box.mType } set { box.mType = newValue } } var mWidth: Int { get { box.mWidth } set { box.mWidth = newValue } } }
方案3:调整继承链顺序(适用范围有限)
如果所有需要用到自定义基类的场景都需要继承RealityKit的Entity,可以直接调整自定义基类的继承关系,让自定义基类继承系统父类,后续业务类继承自定义基类即可:
class Shape: Entity, HasModel, HasCollision { var mType: String = "" } class Box: Shape { var mWidth: Int = 0 var mHeight: Int = 0 } class CustomObject: Box { var someStuff: String = "" }
该方案仅适合所有自定义子类都需要继承同一系统父类的场景,灵活度较低。
内容的提问来源于stack exchange,提问作者Dariusz
相关产品推荐
相关产品推荐

