如何在Scala中建模类别和子类别

时间:2016-01-12 21:25:29

标签: scala

我尝试了解如何为类别和子类别建模。

这是我目前的实施:

function resize() {
    var docWidth = $(window).width();
    if (docWidth < 768){
        var getData = $('#important').html();
        $('.col-lg-3.hidden-xs #important').remove();
        $('.col-lg-3.hidden-xs').append('<div id="important">'+getData+'</div>');
    }
}

$(document).ready(function(){
    resize();

    $(window).resize(function() {
        resize(); 
    });
});

问题:

  • 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
  • 中检索First
  • 如何提供类型安全

为了使其具体化,以下是我想要实现的目标:

Second

1 个答案:

答案 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)
  )
)

可以通过一些拉皮条来改善。但那次定义了两次......所以我会尝试反思。