2016-01-12 63 views
0

我嘗試理清如何對類別和子類別建模。如何在Scala中對類別和子類別建模

這是我目前的執行:

sealed trait First 
sealed trait A extends First 
sealed trait B extends First 
case object A extends A 
case object B extends B 

sealed trait Second[M <: First] 
case object A1 extends Second[A] 
case object B1 extends Second[B] 
case object B2 extends Second[B] 
case object B3 extends Second[B] 

問題:

  • 有一些樣板的First部分
  • 如何從一個Second
  • 一個First如何提供型號安全

爲了讓混凝土,這裏是我想達到的目標:

def first(s: Second[_]) : First = ??? 

case class AObject(s: Second[A]) 
case class BObject(s: Second[B]) 
+0

你碰到什麼問題? –

+0

你打算怎麼處理你的類別?隨着你提供的信息,幾乎不可能說設計是否好... –

+0

問題更新了更多細節 –

回答

0

事情是這樣的,也許:

sealed trait Catg 
sealed trait SubCatgOf[X <: Catg] extends Catg 

case object A extends Catg 
case object B extends Catg 
case object C extends Catg 

case object A1 extends SubCatgOf[A.type] 
case object A2 extends SubCatgOf[A.type] 

case object A1x extends SubCatgOf[A1.type] 

依託A.type有助於減少重複。

爲了獲得一棵真正的樹,你必須訴諸反思或一些宏觀魔法。

或者你也可以手動將其定義是這樣的:

case class Node [X <: Catg](
    category: X, 
    children: List[Node[_ <: SubCatgOf[X]]] 
) 

val hierarchy = Node(
    A, 
    List(
    Node(
     A1, 
     List(
     Node(A1x, Nil) 
    ) 
    ), 
    Node(A2, Nil) 
) 
) 

其可以與一些拉皮條的改善。但那是兩次定義......所以我會嘗試反思。

+0

謝謝。 'A.type'讓我有一天。任何想法實施方法'第一'? –

+0

@YannMoisan反思。可能是某種形式的:'def first(s:Second [_]):First = s.getClass.getSuperTypes ...'等等(不知道我頭頂的細節) –