2009-12-17 7 views
1
class MyModel(var username:String, var password:String) extends FrameworkModel 

object MyModelQuery extends FrameworkQuery { 
    type T = MyModel 
} 

trait FrameworkQuery { 
type T 
//do something with that type 
} 

Donc j'obtiens une classe et un objet où ce dernier se mélange dans un trait qui est défini comme un type abstrait. Existe-t-il un moyen de définir par programme le type au type de classe MyModel, afin que le client n'en ait pas besoin? à-dire « MyModelQuery objet étend FrameworkQuery » prendrait soinen réglant par programme le `type` d'un type abstrait

Répondre

0

Pouvez-vous obtenir un effet similaire en imbriquant juste la requête dans le modèle?

trait FrameworkModel { 
    val model = this 
    trait FrameworkQuery { 
    type T = model.type 
    def getModel: T = model 
    } 
} 

class UserModel extends FrameworkModel { 
    // model stuff... 
    object UserQuery extends FrameworkQuery { 
    // query stuff... 
    } 
} 
+0

la question avec cette approche est que le client peut déclarer plusieurs modèles comme celui-ci: classe MyUserModel (var username: String, mot de passe var: String) étend FrameworkModel classe MyCommentModel (var commentaire: String) étend FrameworkModel dans chaque cas Je voudrais passer le type de modèle au trait de requête dans l'objet de requête correspondant – poko

+0

je vois. On dirait presque que vous voulez un typage statique conventionnel. Les objets compagnons en sont un exemple, mais je ne pense pas que vous puissiez faire des choses arbitraires comme vous le désirez. –

+0

Réponse éditée pour refléter ma dernière compréhension de votre question. –

0
trait T{ 
    type X = this.type 
    def x: X = this 
} 
object A extends T{ 
    def b = "Yep" 
}  
scala> A.x.b 
res0: java.lang.String = Yep 
+0

Merci bien que je ne vois pas comment cela fonctionnerait dans ma situation. this.type retournera l'objet MyModel comme type et non la classe MyModel que je voudrais référencer. Je vais changer un peu l'exemple pour le rendre plus clair. – poko

+0

Vous avez changé les types, n'est-ce pas? Je ne vois pas comment vous relier MyModelQuery et MyModel. –

+0

MyModel peut être consulté avec réflexion et relais sur les conventions de nommage. Donc, je pourrais obtenir une référence à la classe de MyModel mais alors quoi? Donc, je suppose que ma question est de savoir s'il existe un moyen d'exécuter quelque chose de similaire à ce type #, mais sur une classe arbitraire? – poko

Questions connexes