2012-01-26 5 views
1

Java APIから取得したSelenium WebElementがありますが、Scalaクラス、Element、およびmixinのより具体的な特性(Clickable、Submittableなど)を作成しました。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でビルダーを見ることをお勧めしましたが、この特定のアプリケーションとの関係は不明です。明らかに、特性ミックスインよりも優れた方法があれば、その解決策は高く評価されます。

更新:文字列ではなくサブタイプと一致するように大文字小文字を変更しましたが、質問の要点は変更されません。

答えて

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のGoogleはStringを返すWebElementにはtype方法がないことを示しています。だから、typeキーワードのやり方とパターンマッチングの仕方を誤解しているようです。あなたはこれらを調べる必要がありますが、あなたはWebElementのサブクラスであるクラスInputを持っていた場合は簡単に、私はそれがなんとかだとは思わない

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

私は少し質問を誤解したように見えます。上記を行うならば、メソッドの型は混在することなく 'Element'になります。 mixinを使用するには、使用サイトでパターンマッチする必要があります。 –

関連する問題