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
相关产品推荐
相关产品推荐

