我正在設計一個類層次結構,它由一個基類和幾個特徵組成。基類提供了幾種方法的默認實現,並且這些特徵通過abstract override
有選擇地覆蓋某些方法,以充當可堆疊特徵/混合。如何將特徵聲明爲隱式「構造函數參數」?
從設計的角度來看,這工作得很好,並映射到域,這樣我可以從這裏(一個特徵)與謂詞從這裏(另一個特徵)等
增加過濾功能。然而,現在我我喜歡我的一些特徵來獲取隱式參數。我很高興這從設計的角度來看仍然有意義,並且在實踐中不會令人困惑。但是,我無法說服編譯器運行它。
問題的核心似乎是我無法爲特徵提供構造函數參數,因此它們可能被標記爲隱式。在方法實現中引用隱式參數時,無法編譯期望的「找不到隱式值」消息;我試圖通過
implicit val e = implicitly[ClassName]
到「傳播」從施工階段(其中,在實踐中,它總是在範圍內)的隱含的是在方法中可用,但(因爲毫無疑問,你們許多人期望的那樣)該定義以相同的訊息失敗。
看來這裏的問題是我不能說服編譯器用implicit ClassName
標誌標記特徵本身的簽名,並強制調用者(即那些將特徵混合到對象中的調用者)提供隱式。目前我的呼叫者是這樣做,但編譯器不檢查此級別。
有沒有什麼辦法來標記性狀爲需要一定implicits可在施工時間?
(如果沒有的話,就是這根本尚未實現,還是有更深層次的原因,這是不切實際的?)
這是不是讓調用者明確定義'implWrap'雖然在匿名對象中,因爲它是特徵中的抽象字段? (如果沒有,我不明白它是如何設置的;你介意解釋一下嗎?) –
是的,但看到註釋:如果他想使用隱式,他可以只寫'val implWrap = ClassNameW'。我沒有看到一個更好的方法來做到這一點:正如你在問題中提到的,特徵沒有_any_構造函數參數(可能被標記爲隱含的)。 –
當然,我會很高興看到更好的解決方案。 –