如何通过带抽象类型的Trait重构Scala多相似Case Class?
重构相似Case Class为公共Trait结构
你这个重构思路太赞了!把10个功能重复的case class整合到公共trait下,能极大减少冗余代码,还能让结构更清晰。下面是整理后的完整代码结构,以及各部分的作用说明:
// 通用属性容器,存储任意类型的属性值 trait Property[T] { val value: T } // 公共的属性对结构,统一id和属性的组合 trait PropertyPair[T] { val id: Long val prop: Property[T] } // 具体的Size属性类,复用PropertyPair结构,同时提供直观的size访问方法 case class Size(id: Long, prop: Property[Int]) extends PropertyPair[Int] { def size: Int = prop.value } // 具体的Title属性类,同理复用公共结构 case class Title(id: Long, prop: Property[String]) extends PropertyPair[String] { def title: String = prop.value } // 其他8个类似的属性类都可以按照这个模式实现
各部分的作用拆解:
Property[T]:作为通用的属性值容器,用泛型T支持不同类型的属性内容(比如Int、String、Boolean等),把属性值的存储逻辑抽离出来。PropertyPair[T]:统一了id和属性的组合结构,所有具体的属性类都继承这个trait,避免每个case class都重复定义id字段。- 具体case class(如
Size、Title):在复用公共结构的同时,保留了原来类的易用性——比如Size里的size方法,让调用者不用直接访问prop.value,和原来的API体验一致。
这样重构后,后续新增类似的属性类时,只需要照葫芦画瓢继承PropertyPair并添加对应的访问方法即可,维护成本低了很多!
内容的提问来源于stack exchange,提问作者Martee
相关产品推荐
相关产品推荐

