自引用 View/Context 绑定
Self referential View/Context bound
我实际上不清楚以下是视图绑定还是上下文绑定。也不清楚自引用方面(重新引用模型)在做什么;):
abstract class Model[M <: Model[M]] extends Transformer {
如能解释“<: Model[M]”的含义,将不胜感激。
<:
既不是视图也不是上下文绑定,而是类型绑定。
下面是如何使用自引用类型边界的扩展示例。
class ModelA
使用限制性更强的类型绑定 M <: ModelA[M]
以使方法 fooN
工作。 ModelA2
仍然可以扩展 ModelA[ModelA1]
,但不能扩展 ModelA[ModelB1]
。另一方面,class ModelB
没有进一步限制类型绑定,因此 ModelB2
可以扩展 ModelB[ModelA1]
。方法 bar1
和 bar2
限制类型绑定或参数 model
,具体取决于方法 transform
和 bar
在 model
.
object Main extends App {
val a: ModelA1 = foo(new ModelA1(), 2)
val b: ModelA1 = foo(new ModelA2(), 3)
val c: ModelB1 = bar1(new ModelB1())
val d: ModelA1 = bar2(new ModelB2())
def foo[M <: ModelA[M]](model: Model[M], n: Int): M = model.transform.fooN(n)
def bar1[M <: ModelB[M]](model: Model[M]): M = model.transform.bar
def bar2[M <: Model[M]](model: ModelB[M]): M = model.bar.transform
}
abstract class Model[M <: Model[M]] {
def transform: M
}
abstract class ModelA[M <: ModelA[M]] extends Model[M] {
def foo: M
def fooN(n: Int): M = {
var x: M = this.foo
for (_ <- 2 to n)
x = x.foo
x
}
}
abstract class ModelB[M <: Model[M]] extends Model[M] {
def bar: M
}
class ModelA1 extends ModelA[ModelA1] {
override def transform: ModelA1 = ???
override def foo: ModelA1 = ???
}
class ModelA2 extends ModelA[ModelA1] {
override def transform: ModelA1 = ???
override def foo: ModelA1 = ???
}
class ModelB1 extends ModelB[ModelB1] {
override def transform: ModelB1 = ???
override def bar: ModelB1 = ???
}
class ModelB2 extends ModelB[ModelA1] {
override def transform: ModelA1 = ???
override def bar: ModelA1 = ???
}
我实际上不清楚以下是视图绑定还是上下文绑定。也不清楚自引用方面(重新引用模型)在做什么;):
abstract class Model[M <: Model[M]] extends Transformer {
如能解释“<: Model[M]”的含义,将不胜感激。
<:
既不是视图也不是上下文绑定,而是类型绑定。
下面是如何使用自引用类型边界的扩展示例。
class ModelA
使用限制性更强的类型绑定 M <: ModelA[M]
以使方法 fooN
工作。 ModelA2
仍然可以扩展 ModelA[ModelA1]
,但不能扩展 ModelA[ModelB1]
。另一方面,class ModelB
没有进一步限制类型绑定,因此 ModelB2
可以扩展 ModelB[ModelA1]
。方法 bar1
和 bar2
限制类型绑定或参数 model
,具体取决于方法 transform
和 bar
在 model
.
object Main extends App {
val a: ModelA1 = foo(new ModelA1(), 2)
val b: ModelA1 = foo(new ModelA2(), 3)
val c: ModelB1 = bar1(new ModelB1())
val d: ModelA1 = bar2(new ModelB2())
def foo[M <: ModelA[M]](model: Model[M], n: Int): M = model.transform.fooN(n)
def bar1[M <: ModelB[M]](model: Model[M]): M = model.transform.bar
def bar2[M <: Model[M]](model: ModelB[M]): M = model.bar.transform
}
abstract class Model[M <: Model[M]] {
def transform: M
}
abstract class ModelA[M <: ModelA[M]] extends Model[M] {
def foo: M
def fooN(n: Int): M = {
var x: M = this.foo
for (_ <- 2 to n)
x = x.foo
x
}
}
abstract class ModelB[M <: Model[M]] extends Model[M] {
def bar: M
}
class ModelA1 extends ModelA[ModelA1] {
override def transform: ModelA1 = ???
override def foo: ModelA1 = ???
}
class ModelA2 extends ModelA[ModelA1] {
override def transform: ModelA1 = ???
override def foo: ModelA1 = ???
}
class ModelB1 extends ModelB[ModelB1] {
override def transform: ModelB1 = ???
override def bar: ModelB1 = ???
}
class ModelB2 extends ModelB[ModelA1] {
override def transform: ModelA1 = ???
override def bar: ModelA1 = ???
}