2011-05-14 3 views
7

Je sais que certains changements prévus en ce qui concerne les classes de cas, comme interdisant l'héritage entre eux:Quelles choses autour des classes de cas seront supprimées après Scala 2.9 exactement?

scala> case class Foo() 
defined class Foo 

scala> case class Bar() extends Foo() 
<console>:9: warning: case class `class Bar' has case ancestor `class Foo'. Case-to-case inheritance has potentially dangerous bugs which are unlikely to be fixed. You are strongly encouraged to instead use extractors to pattern match on non-leaf nodes. 
     case class Bar() extends Foo() 
       ^
defined class Bar 

ou les classes cas sans liste de paramètres (pas sûr):

scala> case class Foo 
<console>:1: warning: case classes without a parameter list have been deprecated; 
use either case objects or case classes with `()' as parameter list. 
     case class Foo 
        ^
<console>:7: warning: case classes without a parameter list have been deprecated; 
use either case objects or case classes with `()' as parameter list. 
     case class Foo 
        ^
defined class Foo 

Quoi d'autre actuellement @deprecated?

+6

La raison pour laquelle les classes de cas sans listes de paramètres sont « puant » est parce qu'ils ne portent pas l'Etat qui serait différent d'une instance à l'autre, car ils ont pas de champs (à ceux qui sont définis par les arguments constructeur, ce qui est la seule façon de le faire ...), ils devraient donc être des objets cas, puisqu'une seule instance peut représenter tous les "états" possibles. –

+5

@Dean Wampler: Comment les classes de cas avec une liste de paramètres vide '()' sont-elles différentes? – kassens

+3

Pourquoi l'héritage entre les classes de cas est-il malodorant? – djondal

Répondre

8

Chaque classe dans Scala doit avoir au moins une section de paramètre non implicite. Si vous n'en avez pas, le compilateur l'ajoutera pour vous.

scala> class X 
defined class X 

scala> new X() 
res4: X = [email protected] 

scala> class Y 
defined class Y 

scala> new Y() 
res5: Y = [email protected] 

Les classes de cas ne font pas exception. Mais l'interaction avec la recherche de motifs est une source de confusion et de bugs, ce qui motive la dépréciation. Comme le suggère Dean, il est généralement préférable de modéliser ceci avec un objet de cas.

Je ne suis pas au courant d'un calendrier pour la suppression de la prise en charge des classes de cas de liste vide-param. L'héritage de classe de cas a été presque supprimé dans 2.9.0, mais cela a été reporté jusqu'à la prochaine version majeure.

Lectures complémentaires:

Why can't the first parameter list of a class be implicit?

Questions connexes