定义一个只用于一个类的类的最佳方法是什么?

时间:2014-07-23 02:17:27

标签: scala

我为页面视图定义了一个类,它接受一些值来呈现它:

class LoginPage {

  val template = new Template("login")

  def render(data: LoginPage#Data):String = {
    template.apply(data)
  }

  case class Data(username:String, password:String)

}

使用时:

 val loginPage = new LoginPage
 loginPage.render(new LoginPage.Data("freewind", "123"))

虽然有效,但我真的不喜欢使用LoginPage#Data来定义render()方法。

有没有更好的解决方案来组织代码?

2 个答案:

答案 0 :(得分:2)

您应该将Data放入LoginPage的伴随对象而不是类本身,否则Data存在于 LoginPage的每个实例 },这可能会导致一些意想不到的结果:

scala> val loginPage = new LoginPage
       val loginPage2 = new LoginPage

scala> val data = new loginPage.Data("freewind", "123")
       val data2 = new loginPage2.Data("freewind", "123")

scala> data == data2
res6: Boolean = false

这样的事情会更好:

class LoginPage {
    val template = new Template("login")

    def render(data: LoginPage.Data):String = {
        template.apply(data)
    }
}

object LoginPage {
    case class Data(username:String, password:String)   
}

至于不使用完整的LoginPage.Data路径,如果你真的希望它包含在类/对象中,那么我认为你可以用它做很多事情。您可以在import LoginPage._的班级定义中 LoginPage,因此Data的签名中只需要render

class LoginPage {
    import LoginPage._

    def render(data: Data): String = ...
}

答案 1 :(得分:0)

我会render接受两个参数name / password,将它们组合成一个元组,并将其传递给template#apply。我不知道这个方法可以采取什么...

trait LoginPage {
  val template = new Template("login")
  def render(name: String, pw: String) = template((name, pw))
}