2

これは、私が現在取り組んでいる Http-Client の簡略化です。

class Request[A]( val url: String, val event: Callbacks[A] )
{
    def run: Try[A] = ...
}
case class Image( override val url: String, override val event: Callbacks[Bitmap] ) extends Request[Bitmap]

object GET
{
    def apply[A <: Request[B] : ClassTag, B : ClassTag]( url: String, event: Callbacks[B] ): Try[B] =
    {
        classOf[A]
            .runtimeClass
            .getConstructor( classOf[String], classOf[Callbacks[B]] )
            .newInstance( url, event )
            .asInstanceOf[A]
            .run
    }
}

object Main extends App
{
    GET[Image, Bitmap]( "http://...", null )
}

GET次のように呼び出しを行うことができるように、API を改善したいと思います。

GET[Image]( "http://...", null )

一般的な Argumentを指定することはImage、a を使用していることを意味するはずなBitmapので、再度指定したくありません。

4

2 に答える 2

1

次のようなパターンを使用できます:CanBuildFrom適切な を作成する暗黙のビルダーを使用しますRequest:

いくつかのタイプ:

abstract class Content

class Bitmap extends Content

class Callbacks[T]

abstract class Request[C <: Content](val url: String, val event: Callbacks[C]) {
  def run: C
}

class ImageRequest(_url: String, _event: Callbacks[Bitmap]) 
  extends Request[Bitmap](_url, _event) {

  def run: Bitmap = {
    new Bitmap()
  }
}

暗黙の引数の型RequestBuilder:

abstract class RequestBuilder[C <: Content] {
  def create(url: String, event: Callbacks[C]): Request[C]
}

class ImageRequestBuilder extends RequestBuilder[Bitmap]() {
  def create(url: String, event: Callbacks[Bitmap]): ImageRequest = {
    new ImageRequest(url, event)
  }
}

object ImplicitContainer {
  implicit val ImplicitImageRequestBuilder = new ImageRequestBuilder()
}

次のように使用します。

object GET {
  def apply[C <: Content](url: String, event: Callbacks[C])
                         (implicit rb: RequestBuilder[C]): C = {
    rb.create(url, event).run
  }
}

object HttpClient extends App {
  import ImplicitContainer._

  val bitmap = GET[Bitmap]("http://...", null)
  println(bitmap)
}

このようにして、 を呼び出したときに常に異なるリクエストGETを受け取ります。

于 2013-07-06T20:04:54.893 に答える
0

私が得ることができる最も近いものは、暗黙的なパラメーターを提供し、すべての結果マッパー (画像、Html、...) を暗黙的な値として登録することです。これにより、暗黙的な定義が追加されるため、構成のオーバーヘッドがいくらか追加されますが、より優れたカスタマイズの利点が得られます。このようにして、反射部分も取り除きます。

implicit val image = Image.apply _

object GET
{
    def apply[T]( url: String, event: Callbacks[T] )( implicit request: ( String, Callbacks[T] ) => Request[T] ): Try[T] =
    {
        request( url, event ).run
    }
}

import image

GET[Bitmap]( "http://...", null )
GET[Bitmap]( "http://...", null )( myOwnAwesomeImageProcessor _ )
于 2013-07-06T18:40:07.417 に答える