在Scala中可以有多个selftype吗?

在Scala中可以有多个selftype吗?,scala,self-type,Scala,Self Type,我可以有一个在Scala中有两种不同自我类型的类吗?或者以某种方式模仿它 object Hi { trait One { val num = 1 } trait Two { val num = 2 } class Test { this: One => { println(num) } this: Two => { p

我可以有一个在Scala中有两种不同自我类型的类吗?或者以某种方式模仿它

object Hi {
    trait One {
        val num = 1
    }
    trait Two {
        val num = 2
    }
    class Test {
        this: One => {
            println(num)
        }
        this: Two => {
            println(num)
        }
    }
}

import Hi._
new Test with One
new Test with Two
子类型:

scala> trait Num { def num: Int }
defined trait Num

scala> trait One extends Num { val num = 1 }
defined trait One

scala> trait Two extends Num { val num = 2 }
defined trait Two

scala> class Test { _: Num => def f() = println(num) }
defined class Test

scala> new Test with One
res0: Test with One = $anon$1@389adf1d

scala> .f()
1
编辑:也许这是下意识的反应,我应该说是类型类。

子类型:

scala> trait Num { def num: Int }
defined trait Num

scala> trait One extends Num { val num = 1 }
defined trait One

scala> trait Two extends Num { val num = 2 }
defined trait Two

scala> class Test { _: Num => def f() = println(num) }
defined class Test

scala> new Test with One
res0: Test with One = $anon$1@389adf1d

scala> .f()
1

编辑:也许这是下意识的反应,我应该说是类型类。

如果你想同时拥有多个自我类型,你可以写
这个:一个有两个=>…
。在你的例子中,拥有两个独立的自我类型对我来说没有多大意义:如果你有两个不同的主体(具有不同的方法实现、不同的成员等),为什么不将它们分成两个独立的类/特征?

如果你想同时拥有多个自我类型,您可以编写
这个:一对二=>…
。在你的例子中,有两个独立的自我类型对我来说没有多大意义:如果你有两个不同的主体(具有不同的方法实现、不同的成员等),为什么不将它们分成两个独立的类/特征?

很好!非常感谢。真不敢相信我没想到。有不同性格的人呢?我想我可以定义一个任意的catch-all方法…“使用任意不同的特性如何?”您可以使用结构类型作为自类型:
类测试{this:{def-num:Int}=>…}
。我还没有详细测试过,但它至少可以编译。很好!非常感谢。真不敢相信我没想到。有不同性格的人呢?我想我可以定义一个任意的catch-all方法…“使用任意不同的特性如何?”您可以使用结构类型作为自类型:
类测试{this:{def-num:Int}=>…}
。我还没有详细测试,但至少它是编译的。这对我来说有点意义:我可以和a或B混合在一起,如果我是a,就这样做,等等。它将差异行为本地化。不是说这是可取的。也许语法应该是
case this:One=>
。我有一个用例,其中多个self类型都是完美的,并且从任何备选方案中都能发挥最大的作用,但我现在记不起来了。这对我来说是一种意义:我可以与a或B混合,如果我是a,就这样做,等等。它将差异行为本地化。不是说这是可取的。也许语法应该是
case this:One=>
。我有一个用例,其中多个self类型都是完美的,并且从任何备选方案中都能发挥最大的作用,但我现在记不起来了。甚至连一个副本都记不起来了。该问题同时要求多个self类型,以便跟踪单个执行块。我要求根据不同的自我类型进行分支;i、 例如,根据我的自我类型有条件地做事。甚至不接近于重复。该问题同时要求多个self类型,以便跟踪单个执行块。我要求根据不同的自我类型进行分支;i、 例如,根据我的自我类型有条件地做事。