簡體   English   中英

在Scala中使用對象綁定的類

[英]Using object-bound classes in scala

我正在嘗試編寫代碼以包裝建模庫。 該模型的簡化版本如下所示:

class Model() {
    class Thing(val name: String) {
        private[Model] val foo = name + " foo "

        def join(other: Thing) = new Thing(foo + other.foo)
    }

    def thing(name: String) = new Thing(name)
}

foo實際上是與Model的特定實例相關聯的某種數據結構。 使用來自兩個不同ModelThing沒有意義,我認為這種語法可以防止這種情況。

我有幾個scala測試調用model.thing並使用它們,它們可以model.thing工作。

然后,我開始在此之上編寫一個抽象層:

class Widget(name: String)(implicit val model: Model) {
    val thing = model.thing(name)
}

class CompoundWidget(name: String, children: Seq[Widget])(implicit val model: Model) extends Widget(name)
{
    val combo =
        children.sliding(2).foreach(pair => pair(0).thing join pair(1).thing)
}

無法編譯:

Simple.scala:20: error: type mismatch;
  found   : (some other)_1.type(in value $anonfun)#model.Thing where type (some other)_1.type(in value $anonfun) <: com.proteus.orchestration.mediatorModule.scheduling.Widget with Singleton
  required: _1.type(in value $anonfun)#model.Thing where type _1.type(in value $anonfun) <: com.proteus.orchestration.mediatorModule.scheduling.Widget with Singleton
         children.sliding(2).foreach(pair => pair(0).thing join pair(1).thing)
                                                                ^

這似乎是我嘗試防止混合模型工作得太好。 編譯器不知道我傳入的Seq[Widget]對每個元素都使用相同的Model ,因此它給出了錯誤。

有沒有解決的辦法? 似乎可行的方法(但我沒有嘗試過)是使一個類容納整個抽象層,因此編譯器可以看到我始終使用同一Model實例。 但是,這意味着,不管它有多大,我都需要將所有代碼保存在一個文件中,這最終將變得笨拙。

我的背景是開始使用Scala的Java程序員,所以我可能只需要向我介紹Scala Way(tm)。

您在這里使用的是依賴類型 一種方法是通過將WidgetCompoundWidget置於共享范圍中來確保它們引用同一Model

class View(val model: Model) {
  class Widget(name: String) {
    val thing = model.thing(name)
  }

  class CompoundWidget(name: String, children: Seq[Widget]) extends Widget(name) {
    val combo =
        children.sliding(2).foreach(pair => pair(0).thing join pair(1).thing)
  }
}

之所以稱為View是因為我假設您要使用MVC之類的東西。 我想您使用隱式的原因是為了減少樣板。 您可以在此處實現類似的目的:

val view = new View(new Model)
import view._
new Widget("foo")  // No need to specify View or Model

暫無
暫無

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

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