2013-10-30 75 views
0

根據我在X中傳入的對象類型,我需要使用apply方法。我可以指定我想要使用的修飾符(Y或Z)。我需要使用這樣的「下面」功能的語法:在Scala中使用apply方法

(object of type B) following Y 

(object of type C) following Z 

的代碼看起來是這樣的:

trait A 
{ 
    def following(modifier: X) = modifier(this) 
} 
case class B() extends A{} 
case class C() extends A{} 
trait X {} 
object Y extends X 
{ 
    apply(obj: B):B = {} 
    apply(obj: C):C = {} 
} 
object Z extends X 
{ 
    apply(obj: B):B = {} 
    apply(obj: C):C = {} 
} 

編譯器中提供了錯誤在那裏我已經實現了'跟隨'功能。我究竟做錯了什麼?

+1

什麼是你希望這個函數的結果,而你得到什麼錯誤? – Shadowlands

+0

例如:我需要更改B類對象的一個​​字段。因此,修飾符Y接受一個B類型的對象,更改其字段之一(我跳過了它的邏輯),並返回一個相同類型的對象,但只有一個的領域改變了。 –

+1

我建議將該信息添加到問題中(例如顯示預期的使用和結果),以及您正在獲得的實際錯誤。 – Shadowlands

回答

2

我想你想要的是類似的東西:

trait X { 
     def apply[T](obj: T): T 
    } 

    trait A { 
     def following(modifier: X) = modifier(this) 
    } 

    case class B() extends A 
    case class C() extends A 

    object Y extends X { 
     override def apply[B](obj: B): B = { obj } 
     override def apply[C](obj: C): C = { obj } 
    } 

    object Z extends X { 
     override def apply[B](obj: B): B = { obj } 
     override def apply[C](obj: C): C = { obj } 
    } 

不幸,我不認爲你可以有兩種overrided適用的方法和因爲它不會編譯。如果這是可能的,那麼我也很樂意知道。什麼,你可以現在做的是使用一個應用方法與模式匹配:

trait X { 
     def apply[T](obj: T): T 
    } 

    trait A { 
     def following(modifier: X) = modifier(this) 
    } 

    case class B() extends A 
    case class C() extends A 

    object Y extends X { 
     override def apply[T](obj: T): T = { 
      obj match { 
       case o: B => obj 
       case o: C => obj 
      } 
     } 
    } 

    object Z extends X { 
     override def apply[T](obj: T): T = { 
      obj match { 
       case o: B => obj 
       case o: C => obj 
      } 
     } 
    } 

你也可以得到完全相同的效果(包括語法)周圍做其他的方式。 在我看來是更清潔和更容易理解:

sealed trait X 
    case class Y() extends X 
    case class Z() extends X 

    trait A[T] { 
     def following(modifier: X): T 
    } 

    case class B() extends A[B] { 
     override def following(modifier: X) = modifier match { 
      case o: Y => this 
      case o: Z => this 
     } 
    } 

    case class C() extends A[C] { 
     override def following(modifier: X) = modifier match { 
      case o: Y => this 
      case o: Z => this 
     } 
    } 
1

有你做錯了幾件事情:Y中

  1. apply defintions和Z需要被有def
  2. 特徵X需要定義apply方法,儘管只是作爲抽象方法。
  3. following需要在B和C中被覆蓋,這樣編譯器纔會知道X中的哪個重載方法需要調用。
  4. following需要在A.

要實現Visitor模式的抽象。我建議找到the gang of four book的副本,並從那裏的例子開始工作。