2016-05-20 6 views
0

Scalaマクロを使用して、trait内のメソッドの実装者がsuperメソッドを呼び出せるようにすることができます。Scalaマクロを使用すると、メソッド呼び出しの実装者をsuperにできますか?

trait Super { 
    //some macro magic here: list = super.list ++ child.list 
    def list: List[String] = List("ein", "zwei", "DIE") 
} 

class Sub extends Super { 
    override def list: List[String] = List("4", "5") 
} 

object Testy extends App { 
    println(new Sub().list) //List(ein, zwei, DIE, 4, 5) 
} 

アップデート: - これは本当にマクロでなんとかではありません 以下@Sergeyからのコメントを参照してください。このような場合のために。

答えて

1

この特定のケースではマクロは必要ありません。スーパークラスのメソッドのデータを、どのサブクラスのメソッドを実装するすべての結果に追加するかを強制するためには、テンプレートメソッドを使用するのが好ましい方法です。

trait Super { 
    protected def additionalList: List[String] 
    final def list: List[String] = List("ein", "zwei", "DIE") ++ additionalList 
} 

class Sub extends Super { 
    protected val additionalList = List("4", "5") 
} 

object Testy extends App { 
    println(new Sub().list) // List(ein, zwei, DIE, 4, 5) 
} 

更新:final defは、固定部分の加算を行うので、などの可変部分を、宣言抽象defくださいあなたは、元の質問に指定されている、しかし、あなたは」正確に動作が必要な場合私は恐れている:マクロはただちにそれが何をラップするかに影響を与えることができる。 defマクロはメソッドに渡されたものだけを変換することができ、注釈マクロはクラス、フィールド、メソッドなどの即時アノテートを変換することができます。マクロがコードに対してルールを適用する方法はありませんマクロについて知りません。だから基本的に2つの選択肢があります:ユーザにsuperを手動で呼び出させるか、注釈マクロを書いて、ユーザがそのサブクラスに注釈を付けるようにするかのどちらかです。残念ながら、これらのオプションの両方を省略するのは簡単です。

+0

創造的なアプローチですが、Superを実装するプログラマーが期待するように、Subは私のユースケースのリスト機能を実装できる必要があります。 – eirirlar

+0

この場合、あなたは運がうまくいかず、恐れがあります。マクロは、すぐにラップするものにのみ影響します。 defマクロはメソッドに渡されるものだけを変換することができ、注釈マクロはそれが注釈するリテラルを変換することができます。マクロがマクロについて知らないコードのルールを強制する方法はありません。 基本的に2つのオプションがあります:ユーザに 'super'を手動で呼び出させるか、注釈マクロを書いて、ユーザがそのサブクラスに注釈を付けるようにします。残念ながら、どちらも省略するのは簡単です。 – Sergey

+0

説明をありがとう。このコメントは、質問に対する答えと同じように聞こえます。あなたが答えとして投稿するなら、私は受け入れるでしょう。私は、クライアントがスーパーに電話して結果を自分の実装に追加する必要があることを文書に書き留めました。 – eirirlar

関連する問題