2015-10-19 70 views
1

我們知道在Scala中可以通過extends關鍵字後調用構造函數初始化一個單身object的超類的實例,像這樣以相當特殊的方式實施,將其構建方法委託給伴侶對象。如果我想Obj擴展Set的某個實例會怎麼樣?起初我天真地想寫:斯卡拉對象擴展設置實例

object Obj extends Set[Int](1, 2, 3, 4) 

但是,編譯器抱怨,把我的心給我擺在這裏的問題。我誤會了一些基本的Scala層次結構設計規則?

編輯:我正在公開我的用例,以澄清爲什麼我覺得需要子類Set。

trait Group[A] extends Set[A] { 
    def add(x: A, y: A): A 
    val zero: A 
    def inverse(x: A): A 
} 

class CyclicElement(v: Int) { 
    val value = v % 4 
    override def equals(x: CyclicElement) = value == x.value 
} 

object CyclicElement { 
    def apply(v: Int) = new CyclicElement(v) 
} 

object CyclicGroup extends Set[CyclicElement](Zero, A, B, C) with Group[CyclicElement] { 
    override def add(x: CyclicElement, y: CyclicElement) = CyclicElement(x.value + y.value) 
    override val zero = CyclicElement(0) 
    override def inverse(x: CyclicElement) = CyclicElement(4 - x.value) 
} 
+1

1)'immutable.Set'是一個特徵,因此沒有構造函數。 2)通用混凝土不可變實現'TreeSet'和'HashSet'具有私有構造函數,並且'deprecatedInheritance'帶有註釋'「<...>集合的實現細節使得它們不能繼承。」' – Kolmar

回答

0

編譯器抱怨,因爲一個對象是一個單身,並根據定義的對象,不能建設參數。在另一方面,集是一個抽象的接口,所以一個個有實行缺少方法,無論你想創建一個對象或類:

scala> class SI extends Set[Int]{} 
<console>:10: error: class SI needs to be abstract, since: 
it has 4 unimplemented members. 
/** As seen from class SI, the missing signatures are as follows. 
* For convenience, these are usable as stub implementations. 
*/ 
    // Members declared in scala.collection.GenSetLike 
    def iterator: Iterator[Int] = ??? 

    // Members declared in scala.collection.SetLike 
    def -(elem: Int): scala.collection.immutable.Set[Int] = ??? 
    def +(elem: Int): scala.collection.immutable.Set[Int] = ??? 
    def contains(elem: Int): Boolean = ??? 

     class SI extends Set[Int]{} 

然而,一個可以讓一個醜陋的解決方法是這樣的:

scala> object Obj extends Set[Int] { 
    | val content = Set[Int](1,2,3,4) 
    | def -(elem: Int) = content-elem 
    | def +(elem: Int) = content+elem 
    | def contains(elem: Int) = content.contains(elem) 
    | def iterator: Iterator[Int] = content.iterator 
    | } 
defined object Obj 

scala> Obj + 5 
res1: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4) 

(或者你可以聲明content是一個可變的設置保留更改)

UPDATE:

解決方案是派生OBJE ct從集合的具體實現之一:

scala> object Obj extends scala.collection.mutable.HashSet[Int] 
defined object Obj 

scala> Obj += 5 
res4: Obj.type = Set(5) 
+0

對象的要點是什麼?參數還是正在構建?我認爲我在發佈的代碼中看不到任何此類內容。除此之外,我知道有人可能用這種解決方法來解決問題,但感覺不對。其實我要求一種更優雅的方式。 –

+0

是否有用例? – Ashalynd

+0

http://pastebin.com/U3fxEv62 –