2016-07-04 17 views
1

私は、ユーザーが自分自身を繰り返さずにメソッドの実装を選択できるようにする最もクリーンな方法を模索しています。以下の状況では、各サブクラスは特定のクラスのパラメータとともにXMLで挨拶をまとめます。したがって、方法toXMLは形質において抽象的であると宣言される。しかし、私が欲しいのは、クラスの構築で_generalMessageが渡されたかどうかをチェックし、そうであれば、Greetingのすべての実装に共通の一般的なXML挨拶を使用することです。 <Message>_generalMessage</Message>Greetingの各実装で_generalMessageの存在をパターンマッチさせることができますが、もっとエレガントな方法があれば私は興味があります。Scala - 条件付きで特性で実装されたメソッド?

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 

答えて

2

toXMLが最終確認し、ベース特性でそれを定義します。

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

次にあなたが現在toXMLとして持っているものであるためにあなたのサブクラスでspecificMessageを定義します。

+0

美しく機能的な回答 – Azeli

関連する問題