You need to enable JavaScript to run this app. Swift 5+不支持多类继承,如何同时继承自定义基类与系统类?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 00:54:03