当对象作为其超类的 instance/type 传递给方法时,访问该对象的独占成员

Access exclusive members of an object when it's passed into a method as an instance/type of it's superclass

我是 Scala 的新手。以下 4 类 与我的问题相关,存在于用 Scala 设计的测试自动化框架中。如果对象 (LoginPage) 作为超类 (PageObject) 的实例传递给方法并且超类不包含这些成员,是否可以访问该对象 (LoginPage) 的成员(日、月、年)

trait PageObject {
  val rootUrl = "http://localhost:9999/basic-page"
  val back = "backLink"
  val submit = "submit"
  val url: String
  val heading: String
}


object LoginPage extends PageObject {
  val url =s"$rootUrl/login-page"
  val heading = "Heading heading"
  val day = "login_page_day"
  val month = "login_page__month"
  val year = "login_page__year"
}


import LoginPage
object Main {
   def main(args: Array[String]) {
    val date = "15 August 2017"
    enterDateOnPage(date, LoginPage)
   }
 }

<current way>
class DateMethods {    
  def enterDateOnPage(date: String, page: PageObject) {
    val arr = date.split(" ")
    val cal = Calendar.getInstance()
    cal.setTime(new SimpleDateFormat("MMMM").parse(arr(1)))
    numberField(LoginPage.day).value = arr(0)
    numberField(LoginPage.month).value = (cal.get(Calendar.MONTH) + 1).toString
    numberField(LoginPage.year).value = arr(2)
    click on name(LoginPage.submit)
  }
}

<preferred way>
class DateMethods {    
      def enterDateOnPage(date: String, page: PageObject) {
        val arr = date.split(" ")
        val cal = Calendar.getInstance()
        cal.setTime(new SimpleDateFormat("MMMM").parse(arr(1)))
        numberField(page.day).value = arr(0)
        numberField(page.month).value = (cal.get(Calendar.MONTH) + 1).toString
        numberField(page.year).value = arr(2)
        click on name(page.submit)
      }
    }

确认pageMatch实际返回的是LoginPage后,是否可以将'LoginPage.day'等替换为'page.day'?

我确实根据 Samuel Heaney 的回答尝试过类似的方法,但无法编译

def enterDateOnPage(date: String, page: PageObject) {
    val npage = getPage(page)

    val arr = date.split(" ")
    val cal = Calendar.getInstance()
    cal.setTime(new SimpleDateFormat("MMMM").parse(arr(1)))

    numberField(npage.day).value = arr(0)
    numberField(npage.month).value = (cal.get(Calendar.MONTH) + 1).toString
    numberField(npage.year).value = arr(2)
    click on name(npage.submit)


  }

  def getPage(page:PageObject)={
    page match{
      case _:LoginPage.type => LoginPage
      case _:EntryFormPage.type => EntryFormPage
    }

仅当我将日、月和年作为成员添加到 PageObject 特征时才有效,但这对我来说不是一个可行的选择

您可以使用模式匹配来测试它是否 LoginPage

class DateMethods {    
  def enterDateOnPage(date: String, page: PageObject): Unit = {
    page match {
      case LoginPage =>
        setUIFields(
          LoginPage.day,
          LoginPage.month,
          LoginPage.year,
          date
        )
      case LogoutPage =>
        setUIFields(...)
      case EntryFormPage =>
        setUIFields(...)
    }
    click on name(page.submit)
  }

  def setUIFields(
    day: String,
    month: String,
    year: String,
    date: String
  ): Unit = {
    val arr = date.split(" ")
    val cal = Calendar.getInstance()
    cal.setTime(new SimpleDateFormat("MMMM").parse(arr(1)))
    numberField(day).value = arr(0)
    numberField(month).value = (cal.get(Calendar.MONTH) + 1).toString
    numberField(year).value = arr(2)
  }
}

将您的日期逻辑放入其自身的特征中并与之匹配。

trait Dates {
  val day: String
  val month: String
  val year: String
}

case object LoginPage extends PageObject with Dates {
  val day = ""
  val month = ""
  val year = ""
  // additional code
}

现在您的函数可以专门匹配特征

def enterDateOnPage(date: String, page: PageObject) {
  page match {
    case datePage: Dates => {
      // add log to validate date fields
    }
    case _ => // no-op
  }

  // additional code
}