2012-01-26 27 views
1

我们从Java API获得了Selenium WebElement,但我们创建了Scala类,Element和mixin更具体的特征(例如可点击,可提交等)。在Scala中保留具有返回值的mixin特性

我们的方法是这样的:

toScalaElement(e : WebElement) = { 
    e.type match { 
     case Input => new Element(e) with Submittable 
     case Link => new Element(e) with Clickable 
     ... 
     case _ => new Element 
    } 
} 

返回类型总是元素因为这是根类的所有案件。但是,我们希望在返回时保留mixin特征。

建议您查看Scala的Collections API中的构建器,但我们不确定它与这个特定应用程序的关系。显然,如果有比特性mixins更好的方法,解决方案将被赞赏。

更新:我改变了大小写来匹配子类型而不是字符串,但问题的本质保持不变。

回答

2

我不认为这是可行的。整个方法需要有一个返回类型。在构建器的情况下,这种返回类型是通用的,因此可以在方法调用之间有所不同,但编译器需要具有不同类型的参数来选择构建器。它看起来像这样:

case class WebElementConverter[T1, T2](f: T1 => T2) { 
    def convert(e: T1) = f(e) 
} 

object WebElementConverter { 
    implicit val inputConverter = WebElementConverter[Input, Element with Submittable](x => new Element(x) with Submittable) 
    // other converters 
} 

def toScalaElement[T1 <: WebElement, T2 <: Element](e : T1)(implicit b: WebElementConverter[T1, T2]) = b.convert(e) 

在这里,现在你可以得到想要的结果

val i = new Input // same as val i: Input = new Input 
toScalaElement(i) 

但不是在这里:

val i: Element = new Input 
toScalaElement(i) // looks for an implicit WebElementConverter[Element, <some type>] 

因此,如果静态类型的e只是WebElement,建设者不帮忙。

0

type是Scala的关键字,虽然我不知道什么硒的its API一个谷歌的显示有上WebElement没有type方法返回一个String。所以它看起来像是误解了关键字type的作用,以及模式匹配是如何工作的。你应该看看这些,但是简单地说,如果你有一个类Input那就是WebElement一个子类,你可以匹配类型与

def toScalaElement(e: WebElement) = e match { 
    case x: Input => new Element(x) with Submittable 
    // etc 
+1

看起来我有点误解了这个问题。如果你这样做,方法类型当然是'元素'没有任何mixin。要使用mixin,您必须在使用站点进行模式匹配。 –