Kotlin中为何要在数据类的val前加override实现接口?
在Kotlin里,实现NiaNavigationDestination接口除了官方示例中数据类主构造器直接override属性的方式外,还有以下几种常见写法:
- 在类体中显式实现接口属性
不管是普通类还是数据类,都可以在类内部单独实现接口属性,适合需要对属性做额外逻辑处理的场景:
data class TopLevelDestination( val selectedIcon: Icon, val unselectedIcon: Icon, val iconTextId: Int ) : NiaNavigationDestination { override val route: String = "home_route" override val destination: String = "home_destination" } // 普通类写法示例 class HomeDestination : NiaNavigationDestination { override val route: String get() = "home_route" // 可在此添加计算逻辑 override val destination: String = "home_destination" }
- 通过伴生对象实现接口(单例场景)
如果某个导航目的地不需要多个实例,可以用伴生对象实现接口,当作单例使用:
object HomeDestination { companion object : NiaNavigationDestination { override val route: String = "home_route" override val destination: String = "home_destination" } } // 使用时直接调用 HomeDestination.Companion.route
- 匿名内部类实现(临时场景)
如果只是临时需要一个接口实例,可以用匿名内部类快速实现:
val tempDestination = object : NiaNavigationDestination { override val route: String = "temp_route" override val destination: String = "temp_destination" }
- 抽象类做中间层,子类继承实现
如果有多个类需要实现该接口,且部分属性有共同逻辑,可以先定义抽象类实现部分属性,子类只实现差异化内容:
abstract class BaseDestination : NiaNavigationDestination { // 统一实现destination的格式逻辑 override val destination: String get() = "${route}_destination" } class HomeDestination : BaseDestination() { override val route: String = "home" } class SearchDestination : BaseDestination() { override val route: String = "search" }
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

