簡體   English   中英

自參照視圖/上下文綁定

[英]Self referential View/Context bound

我實際上不清楚以下內容是視圖還是上下文綁定。 也不清楚自我參照方面(重新參照模型)在做什么;):

abstract class Model[M <: Model[M]] extends Transformer {

將理解“ <:模型[M]”的含義的解釋。

<:既不綁定視圖也不綁定上下文,但綁定類型。

以下是如何使用自引用類型范圍的擴展示例。

為了使方法fooN起作用,類ModelA使用了更嚴格的類型綁定M <: ModelA[M] ModelA2仍然可以擴展ModelA[ModelA1] ,但不能ModelA[ModelB1] 另一方面,類ModelB不再限制類型綁定,因此ModelB2可以擴展ModelB[ModelA1] 方法bar1bar2限制任一結合的類型或參數model ,依賴於在其中方法的順序上transformbar被稱為上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 = ???
}

暫無
暫無

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

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