2010-10-21 6 views
1

Pourquoi est-ce acceptable:F # définition de classe avec et sans l'interface

type SomeClass<'T> = 
    val mutable id : int 
    val mutable result : 'T 

Mais ce n'est pas:

type SomeIface = 
    abstract id : int 

type SomeClass<'T> = 
    interface SomeIface with 
     val mutable id : int 
     val mutable result : 'T 

Le compilateur se plaint de mon utilisation de 'val' me disant d'utiliser « membre 'mais alors je ne peux pas utiliser mutable.

Répondre

4

réponse de Desco est correcte. En ce qui concerne pourquoi votre approche ne fonctionne pas, la clé est que F #, quand vous avez quelque chose comme

interface Iface with 
    [indented lines here] 

les lignes dentelées ne peuvent contenir que des implémentations des membres de l'interface. Ils ne doivent pas contenir de champs ou de membres supplémentaires du type que vous définissez (par exemple, les deux champs modifiables dans votre cas). Par conséquent la réponse de desco fonctionne, comme quelque chose comme ce qui suit:

type SomeIface = 
    abstract id : int 

type SomeClass<'T> = 
    interface SomeIface with 
     member this.id = this.id 
    val mutable id : int 
    val mutable result : 'T 
4

champs de mouvement au-dessus de l'interface mise en œuvre

type SomeIface = 
    abstract id : int 

type SomeClass<'T>() = 
    [<DefaultValue>] 
    val mutable id : int 
    [<DefaultValue>] 
    val mutable result : 'T 
    interface SomeIface with 
     member this.id = this.id 

let x = SomeClass<int>(id = 10) 
let y : SomeIface = upcast x 
printfn "%d" y.id