Kotlin中基类如何操作派生类所持有的派生类实例列表?
你当前的实现存在冗余和数据不一致的风险,每次手动同步两个列表属性的操作完全可以通过泛型基类的方案替代,不需要额外维护基类的genericItems属性。
优化方案
将基类声明为带型变约束的泛型类,基类中定义抽象的列表属性,派生类直接重写对应子类型的列表即可,基类的通用逻辑可以直接操作该属性,不需要额外同步、也不需要强制类型转换。
可直接运行的Kotlin实现代码:
// 基类声明泛型,上界约束为a类,out协变适配只读列表的场景 open class A<out T : a> { // 基类声明抽象列表属性,通用逻辑直接操作该属性即可 abstract val items: List<T> fun methodForGenericItems() { // 此处items会被识别为List<a>,可直接调用a类的公共属性/方法实现通用逻辑 items.forEach { item -> println(item.commonField) } } } // 派生类B指定泛型参数为b类 class B : A<b>() { // 直接重写items为List<b>类型,无需额外定义属性 override val items: MutableList<b> = mutableListOf() fun updateItems() { // 直接更新当前类的items,基类自动获取最新值,无需同步 items.add(b()) } fun methodForDerivedItems() { // 此处操作items时自动识别为b类型,可调用b类的特有方法 items.forEach { it.bOnlyMethod() } methodForGenericItems() } } // 派生类C同理 class C : A<c>() { override val items: MutableList<c> = mutableListOf() fun updateItems() { items.add(c()) } fun methodForDerivedItems() { items.forEach { it.cOnlyMethod() } methodForGenericItems() } } // 业务实体类定义 open class a { val commonField = "基类公共属性" } class b : a() { fun bOnlyMethod() = println("b类特有方法") } class c : a() { fun cOnlyMethod() = println("c类特有方法") }
补充说明
- 如果需要在基类中修改列表内容,去掉泛型的
out修饰符,将items声明为MutableList<T>即可。 - 该方案不存在强制类型转换的安全隐患,也完全规避了双属性不同步的问题,符合面向对象的多态设计规则。
内容的提问来源于stack exchange,提问作者Sam Westlake
相关产品推荐
相关产品推荐

