Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用隐式转换代替适配器模式_Scala_Implicit Conversion - Fatal编程技术网

Scala 使用隐式转换代替适配器模式

Scala 使用隐式转换代替适配器模式,scala,implicit-conversion,Scala,Implicit Conversion,我有一个MVC风格的项目。视图如下所示: trait BaseView { def asComponent(): Component // each view can be displayed on screen } class ConcreteView extends Panel with BaseView { def asComponent(): Component = this //ConcreteView is itself Component because it ex

我有一个MVC风格的项目。视图如下所示:

trait BaseView {
  def asComponent(): Component // each view can be displayed on screen
}


class ConcreteView extends Panel with BaseView  {

  def asComponent(): Component = this //ConcreteView is itself Component because it extends Panel 
}

可以将此代码更改为使用从
ConcreteView
Component
的隐式转换?因此,我可以使用
ConcreteView
作为
Component
(由于隐式转换),而无需调用
ConcreteView\asComponent
方法?

是的,这是可能的。只需定义从BaseView到调用asComponent方法的组件的隐式转换

object BaseView {
  implicit def viewIsComponent(x:BaseView) : Component = x.asComponent
}
但这并不意味着这是一个好主意。scala中的隐式转换是一个非常强大的功能。如果一个BaseView(通过继承每个XXXView)是一个组件,这意味着当您想要调用val myView:SomeView的方法时,您将获得组件的所有方法。这完全扰乱了名称空间,也可能是危险的,因为您不确定是否调用了视图的方法或它隐式映射到的组件的方法

在scala库中,已经从隐式转换转向更显式、更详细的方式。举个例子:它们提供从scala集合到java集合的隐式转换。这听起来是个好主意,但在实践中却造成了很多麻烦:

  • 转换发生在您不希望它们发生的时候
  • scala集合的名称空间与java等价物中的许多附加方法混杂在一起
  • 当向隐式转换的目标添加新方法时,很难发现与转换源中的方法冲突的问题
当前推荐的处理java/scala集合互操作的方法是使用更显式的方法,它将单个方法asScala添加到java集合中,并将asJava添加到scala集合中


所以,让方法保持原样。可能会将名称更改为just.component,因为您并不真正将视图转换为组件,而是只允许某人访问每个视图必须具有的组件。

是的,这是可能的。只需定义从BaseView到调用asComponent方法的组件的隐式转换

object BaseView {
  implicit def viewIsComponent(x:BaseView) : Component = x.asComponent
}
但这并不意味着这是一个好主意。scala中的隐式转换是一个非常强大的功能。如果一个BaseView(通过继承每个XXXView)是一个组件,这意味着当您想要调用val myView:SomeView的方法时,您将获得组件的所有方法。这完全扰乱了名称空间,也可能是危险的,因为您不确定是否调用了视图的方法或它隐式映射到的组件的方法

在scala库中,已经从隐式转换转向更显式、更详细的方式。举个例子:它们提供从scala集合到java集合的隐式转换。这听起来是个好主意,但在实践中却造成了很多麻烦:

  • 转换发生在您不希望它们发生的时候
  • scala集合的名称空间与java等价物中的许多附加方法混杂在一起
  • 当向隐式转换的目标添加新方法时,很难发现与转换源中的方法冲突的问题
当前推荐的处理java/scala集合互操作的方法是使用更显式的方法,它将单个方法asScala添加到java集合中,并将asJava添加到scala集合中


所以,让方法保持原样。可能会将名称更改为just.component,因为您并不真正将视图转换为组件,而是只允许某人访问每个视图必须具有的组件。

为什么您甚至需要这样的方法
val c:Component=someConcreteView
应该已经可以工作了。为了更好地理解什么时候应该和什么时候不应该对适配器模式使用隐式转换,我建议您阅读我的博客文章-为什么您甚至需要这样的方法
val c:Component=someConcreteView
应该已经可以工作了。为了更好地理解什么时候应该和什么时候不应该对适配器模式使用隐式转换,我建议您阅读我的博客文章-