0

我有一个用 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 
}

可以更改此代码以使用从ConcreteViewto的隐式转换Component?所以我可以在不调用方法的情况下使用ConcreteViewas Component(由于隐式转换) ConcreteView#asComponent

4

1 回答 1

3

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

object BaseView {
  implicit def viewIsComponent(x:BaseView) : Component = x.asComponent
}

但这并不意味着这是一个好主意。scala 中的隐式转换是一个非常强大的功能。如果一个 BaseView(并且通过继承每个 XXXView)是一个Component,这意味着当你想调用 val myView:SomeView 的方法时,你将获得 Component 的所有方法。这完全使命名空间混乱,也可能很危险,因为您不确定是调用 View 的方法还是隐式映射到的 Component 的方法。

在 scala 库中,已经从隐式转换转向更显式和稍微冗长的方式。以JavaConversions 为例:它们提供从 scala 集合到 java 集合的隐式转换。这听起来是个好主意,但在实践中却造成了很多麻烦:

  • 当您不期望它们发生转换时
  • scala 集合的命名空间中充斥着大量来自 java 等价物的附加方法
  • 当新方法添加到与转换源中的方法冲突的隐式转换的目标时,很难发现问题

当前推荐的处理 java/scala 集合互操作的方法是使用更显式的JavaConverters,它将单个方法 asScala 添加到 java 集合,将 asJava 添加到 scala 集合。

因此,只需保留该方法。也许将名称更改为 .component,因为您并没有真正视图转换为组件,而只允许某人访问每个视图必须具有的组件。

于 2013-07-21T08:43:48.043 回答