簡體   English   中英

Scala對象擴展抽象類/特征,訪問伴隨類字段

[英]Scala object extends abstract class/trait, access companion class fields

目前,我有以下代碼:

case class Foo(text: String, tag: Tag) {...}
object Foo {
    def doSomething(fooSeq: Seq[Foo]) = fooSeq.map(f => f.tag)
    def doSomethingElse() = {...}
}

我想將doSomething方法移到一個抽象的類/特征中,以便可以對標記進行參數設置並在以后重用代碼。 理想情況下,我想做這樣的事情:

case class Foo(text: String, tag: Tag) {...}
object Foo extends TraitFoo[Tag] {
    def doSomethingElse() = {...}
}

---------------in another file----------------

trait TraitFoo[T] = {
    def doSomething(fooSeq: Seq[TraitFoo[T]]) = fooSeq.map(f => f.tag)
}

但是,編譯器抱怨無法識別f.tag中的TraitFoo

我考慮使用抽象類,但這也會引起問題,因為我的對象Foo不需要構造函數。 它只需要訪問其伴隨類中的字段。

也許您可以向TraitFoo添加另一個具有結構限制的類型參數? 像這樣:

trait TraitFoo[A, B <: { def tag: A }] {
    def doSomething(fooSeq: Seq[B]): Seq[A] = fooSeq.map(f => f.tag)
}

case class Foo(text: String, tag: Tag) { ... }
object Foo extends TraitFoo[Tag, Foo] {
    def doSomethingElse() = { ... }
}

基本上與此相同,但是比較冗長/不太明確:

trait Tagged[A] {
    def tag: A
}
trait TraitFoo[A, B <: Tagged[A]] {
    def doSomething(fooSeq: Seq[B]): Seq[A] = fooSeq.map(f => f.tag)
}

case class Foo(text: String, tag: Tag) extends Tagged[Tag] { }
object Foo extends TraitFoo[Tag, Foo] {
    def doSomethingElse() = { }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM