2013-06-05 55 views
2

的隱含VAL當我寫在斯卡拉與case類節目中,我遇到了一個循環模式,我希望把一個案例類的創建者作爲參數,以供日後參考。我明白了,我們可以通過把隱性價值的情況下,類抽象案例類

abstract class MessageCreator 
case class SomeMessage(s:String)(implicit val creator:MessageCreator) 
class MyCreator extends MessageCreator { implicit val creator = this} 
class ACreator extends MyCreator { def newMessage = SomeMessage("hello") } 

然後捕獲這種模式,NewMessage作爲這裏將有指ACreator自身的實例成員creator

現在,我有一堆case類,會做同樣的事情。我的問題是,如果每次我想定義這樣的案例類時,如何複製並粘貼(implicit val creator:MessageCreator),您將如何重複此模式?

我試圖定義與隱VAL一個抽象類,然後從案例類繼承他們,但Scala的抱怨,從抽象類的隱性VAL的情況下類沒有定義。顯然,case類不能被繼承。

如果不能以編程方式做,我可能會開始尋找到寫一個宏(這將是一個精解)。我想確保我不會在這裏丟失任何東西。

+0

恕我直言,這樣的參數應該明確,只有明確通過。如果你真的需要這個,你可以使用伴侶對象作爲工廠來傳遞創建者參數。 – vitalii

+0

感謝您的評論。如果我有一個伴隨對象,比如說'def apply(隱式val創建者:MessageCreator){...}',那麼如何讓case類繼承這樣的伴隨對象類呢? –

回答

1

不知道更多關於它的域名我會問的線沿線的一些問題:

  1. 爲什麼不能你的工廠是你的伴侶的對象?對於一個case類來說,這已經明確地是由於語言和它的編譯器。如果你需要另一個我會超載申請。

  2. 爲什麼你的類需要創建更多的自身的能力嗎?這不是什麼部分「複製」是(和部分我的意思是不替換所有字段。)

這個賽季我會問這樣的問題是,沒有背景的,這聽起來像你」已經引入了額外的複雜性而沒有太多好處

最後,如果你正在暗中穿過狀態我警告你不要它。這可能會導致各種各樣的問題和問題。除非它們引起了一個錯誤,否則它們是非常好的,在這種情況下,這個錯誤很難被破譯和追蹤。我幾乎會走這麼遠,說你應該只使用隱式類型的類

+0

您好,感謝答案 1.當然,我可以實現與同伴對象類似的事情。但它給了什麼價值?它似乎沒有給我繼承(或者是否)? –

+0

2.那麼,讓我從第一個原則進行爭論。如果程序員被重複一遍又一遍地寫相同的代碼塊同樣的關注,這是很自然的,他/她認爲抽象它的方式,使他/她並不需要提供姓名,以這樣的事隱「創造者的價值,並依賴於不同實體共同關注的命名約定。現在,如果Scala使用同母語言,那麼實現它將是非常自然的事情。隨着最近向Scala添加宏,我可以使用宏來實現這一點。問題是,它可以在Scala的語義中完成嗎? –

+0

和w.r.t.你最後的評論,我隱含地傳遞給一個類的參考。我在OP中沒有提到,但問題的上下文是當演員向另一個發送消息時,我想要傳遞消息的發送者,以便我可以追蹤演員的原始發件人。對我來說,這聽起來不像傳遞給各州。但是,當然,可以濫用這一點並繼續對原始發件人產生副作用,這是不可取的。 –