Scala简单的类设计

时间:2013-12-01 13:47:40

标签: scala

我想要一个概念上包含三个信息的对象类型:

  1. 一个字符串
  2. 将字符串映射到字符串的字典(Scala映射)
  3. 可以是“word”或“punctuation”的类型
  4. 同样重要的是,这个对象类型应该是保存文本文档内容的基础 - 通过拥有可迭代的实例。

    我目前正在实现这个作为一个类层次结构,其中有一个包含1和2的第一个类,然后是两个继承它的类,一个叫做“word”,另一个叫做“标点符号”,如下所示:

    abstract class TextElement(initContent: String, initStyleMap: Map[String, String]) {
      val content : String = initContent
      val styleMap: Map[String, String] = initStyleMap
    }
    
    case class Word(initContent: String, initStyleMap: Map[String, String]) extends TextElement(initContent: String, initStyleMap: Map[String, String]) {
    
    }
    
    case class Punctuation(initContent: String, initStyleMap: Map[String, String]) extends TextElement(initContent: String, initStyleMap: Map[String, String]) {
    
    }
    

    我想知道是否还有比我刚才描述的第一个直觉更适合的东西,因为在Scala中可能有更精简或更清洁的方式。

    值得注意的是,我将拥有数千个这些对象的实例,因此内存占用非常重要,并且可以快速访问数据。我天真的实现感觉有点样板,而且,也许还有其他方法我忽略了。

    所以我想知道是否有一种可行的不同方法,而不是直观的方法,这可能有任何好处。 此外,上述代码是否可以更加优雅/简洁

1 个答案:

答案 0 :(得分:4)

您可以使用trait而不是抽象类来减少代码:

sealed trait TextElement {
  def content: String
  def styleMap: Map[String, String]
}

case class Word(content: String, styleMap: Map[String, String]) extends TextElement
case class Punctuation(content: String, styleMap: Map[String, String]) extends TextElement

sealed keyword允许编译器检查匹配是否详尽。