2012-02-03 19 views
3

這是我在Scala中遇到的,並沒有在Java中引起任何問題的東西。現在我只是不知道在Scala中做這件事的正確方法是什麼。斯卡拉 - 組織單身人士對象層次結構的正確方法是什麼?

問題描述:我有一個Scala對象,它表示一個'抽象'對象。它的目的是具有一個單一的配置文件,但它並不打算用於實際使用,它只是一羣兒童共同的定義 - 單身人士。相反,我想用它的孩子。所以出現了這樣的問題:因爲我不能繼承對象,所以普通的單例功能應該作爲一個類來實現嗎?作爲一個抽象類?特質不適合我,因爲它不能有構造函數。 如果一個抽象的父類會做,那麼我應該如何訪問它的單例(或靜態)方法,如果我需要它們的話呢? 我意識到我的設計中可能存在一個缺陷,但由於我有這個問題,並且無法想出任何明確的答案,所以聽到你說的話(包括設計方案)是很有趣的。

+0

感謝您的答案指定常用功能所需的值!我認爲他們耗盡了話題!我將與這個特質一起去。 – noncom 2012-02-03 11:34:32

回答

6

你真的應該使用trait;沒有必要使用構造函數(實際上,它們沒有意義,因爲scala object沒有構造函數):

這是共享特性; needA是您需要傳遞給構造函數的值。也就是說,這是性狀的功能所要求的。

trait Common { 
    def needA: A 

    def sharedMethod { /* implement me*/ } 
} 

然後你的模塊是這樣的:

object Mod1 extends Common { 
    val needA = { /* implement me*/ } 
}  
object Mod2 extends Common { 
    val needA = { /* implement me*/ } 
}  

發現,他們通過使用val來覆蓋def

+0

,如果您需要不同的實現(例如模擬和生產變體),請使用蛋糕模式以及自我類型。強大的模式:http://jboner.github.com/2008/10/06/real-world-scala-dependency-injection-di.html – virtualeyes 2012-02-03 11:47:17

2

您的關注與scala中集合庫中伴隨對象的設計中出現的問題非常相似。 他們選擇使用爲伴侶對象收集類似功能的caommon特質。進一步,請看GenericCompanion特徵及其已知的子類。

相關問題