【问题标题】:Scala - methods conditionally implemented in trait?Scala - 有条件地在特征中实现的方法?
【发布时间】:2016-07-04 11:45:22
【问题描述】:

我正在寻找一种最简洁的方式,让用户无需重复自己就可以选择方法的实现。在下面的情况下,每个子类将 XML 中的问候语与来自特定类的参数放在一起。因此方法toXML 在特征中被声明为抽象的。但是,我想要检查是否在类的构造中传入了 _generalMessage,如果是,则使用所有 Greeting 实现通用的通用 XML 问候语,例如<Message>_generalMessage</Message>。我知道我可以在Greeting 的每个实现中对_generalMessage 的存在进行模式匹配,但我很好奇是否有更优雅的方式。

trait Greeting {
  protected var foo = //...
  protected var _generalMessage: Option[Srting] = None
  //...
  //public API
  def generalMessage: String = _generalMessage match {case Some(x) => x; case None =>""
  def generalMessage_=(s: String) {_generalMessage = Some(s)}

  protected def toXML: scala.xml.Node

}

class specificGreeting1 extends Greeting {
  // class implementation
  def toXML: scala.xml.Node = <//a detailed XML with values from class specificGreeting1>
}
// multiple other specificGreeting classes

【问题讨论】:

    标签: scala


    【解决方案1】:

    toXML 设为final,并在基础特征中定义它:

      final def toXML = _generalMessage.fold(specific message) { m =>
           <Message>m</Message>
      }
    

    然后在您的子类中定义specificMessage 为您当前拥有的toXML

    【讨论】:

    • 功能齐全的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多