2013-07-29 58 views
1

我有以下特點:循環引用時試圖隱藏REPR

sealed trait CommandLike[T, Repr <: CommandLike[T,_]] extends CanBeEnabled[Repr]{ 
    def name: String 
    def execute: T => Any 
} 

trait CanBeEnabled[Repr] { 
    def enabled: Boolean 
    def isEnabled = enabled 
    def isDisabled = enabled 
    def disable : Repr = setEnabled(enabled = false) 
    def enable : Repr = setEnabled(enabled = true) 
    def setEnabled(enabled: Boolean) : Repr 
} 

現在我希望有命令的列表:

val cmds = List[CommandLike[Unit, _]]() 

這是煩人,所以我寧願隱藏REPR類型參數:

val cmds = List[Command[Unit]]() 

所以我需要命令特質隱藏REPR:

trait Command[T] extends CommandLike[T, _ <: Command[T]] 

但是這給了我:

涉及性狀命令特質命令非法循環參考[T] 延伸CommandLike [T,_ <:命令[T]

任何想法? ^

回答

1
trait CanBeEnabled { 
    def enabled: Boolean 
    def isEnabled = enabled 
    def isDisabled = ! enabled 
    def disable : this.type = setEnabled(enabled = false) 
    def enable : this.type = setEnabled(enabled = true) 
    def setEnabled(enabled: Boolean) : this.type 
} 

sealed trait Command[T] extends CanBeEnabled { 
    def name: String 
    def execute: T => Any 
} 

isDisabled應該是!啓用...

+0

Reuben,你能給我們一個具體的Command實例編譯的例子,即類X擴展Command [Unit] {...}。另外我應該可以這樣做:var x = new X; x = x.disable。你能否在你發佈之前檢查它是否編譯好,請。 – piotrga

0

爲您trait Command實施CommandLikeReprCommand[T],所以你應該有:

Command[T] extend CommandLike[T, Command[T]] 

用同樣的方法收集庫定義,例如,

Seq[T] extends ... with SeqLike[T, Seq[T]] 

@ Reuben的答案也適用於不同的語義:

運行後,如果您定義另一個命令:

class CustomCommand[T] extends Command[T] 
  • this.type情況下(單式),setEnabled將返回一個CustomCommand[T]
  • 並在Repr情況下,我上面的描述,setEnabled將返回Command[T]因爲這是如何定義Repr

兩者都很好,這一切都取決於你實際需要什麼。對於這樣的實用方法,this.type似乎更好。