2010-12-10 15 views
1

Est-il possible de refactoriser les éléments suivants?Fonction de copie de refactoring

case class Foo(
    a: List[String]) { 
    def +(s: String) = copy(a = s :: a) 
    } 

    case class Bar(
    a: List[String], 
    b: Int) { 
    def +(s: String) = copy(a = s :: a)  
    } 
+0

De quelle façon? Quel semble être le problème? –

+0

@Daniel Dupliqué 'def + (s: String) = copie (a = s :: a)', Je suppose –

+0

Code dupliqué. Pas un problème en soi. –

Répondre

1

copy ne peut pas être extrait à une super-classe (si c'est ce que vous cherchez) - c'est une méthode généré par le compilateur.

+0

Je suis conscient de cela, mais j'étais Je me demandais s'il y aurait un autre moyen de réduire la duplication dans des cas comme celui-ci. –

1

Vous pourrait faire avec une immense quantité de réflexion, d'une manière un peu fragile, en utilisant les (sans papiers) copy$default$1 méthodes et types correspondant au large de la méthode copy, et ayant à la fois mettre en œuvre un trait qui comprenait def a: List[String] et def a_=(a0: List[String]). Mais c'est une mauvaise idée. le support n'est pas complètement là (par exemple si vous l'avez mélangé dans une classe non-classe, il échouerait à l'exécution), il est lent, et il enregistre seulement une petite quantité de frappe. Si vous avez un cas où cela permettrait d'économiser une énorme quantité de frappe, je vous encourage à utiliser la génération de code à la place (c'est-à-dire le code Scala qui écrit le code Scala) avec une passe supplémentaire pour la compilation.