You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM中能否使用expect抽象类实现部分方法跨平台共享?

KMM 共享类混合通用/平台特有逻辑实现方案

首先明确:你提供的示例代码无法直接编译运行,KMM 中的 expect 仅作为平台实现的声明占位符,不支持编写属性初始化、方法默认实现等通用逻辑,也无法直接作为抽象类承载跨端通用代码。你提到的expect/actual 类结合公共父类的方案是该场景下的最优实现。


实现思路

将所有跨端通用的属性、方法实现收拢到 common 层的抽象基类中,仅把需要平台差异化实现的方法声明为抽象方法;再让 expect/actual 类继承该抽象基类,平台侧仅需要实现对应的抽象方法即可。

代码示例

commonMain 层代码

// commonMain 抽象基类,存放所有通用逻辑
abstract class BaseLogger {
    // 通用状态直接在基类定义初始化
    protected var timer: Long = 0

    // 完全通用的方法直接在基层实现
    fun resetTimer() {
        timer = 0
    }

    // 平台特有方法声明为抽象,强制双端实现
    abstract fun info(s: String)
    abstract fun warning(s: String)
}

// commonMain 声明expect占位类,继承基类即可
expect class Logger() : BaseLogger

androidMain 层实现

// androidMain 实际实现类
import android.util.Log

actual class Logger actual constructor() : BaseLogger() {
    override fun info(s: String) {
        Log.d("Logger", s)
    }

    override fun warning(s: String) {
        Log.w("Logger", s)
    }
}

iosMain 层实现

// iosMain 实际实现类
import platform.Foundation.NSLog

actual class Logger actual constructor() : BaseLogger() {
    override fun info(s: String) {
        NSLog("[INFO] %@", s)
    }

    override fun warning(s: String) {
        NSLog("[WARNING] %@", s)
    }
}

方案优势

  • 通用逻辑完全收拢在common层,双端无需重复实现,避免多端维护不一致问题
  • 支持存储通用状态(如示例中的timer属性),比纯接口实现更适合有状态的工具类场景
  • 平台侧仅需要关注差异化逻辑的实现,符合单一职责原则

内容的提问来源于stack exchange,提问作者Roman Gelembjuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:30:02