2014-12-02 13 views
5

La mia comprensione è che i record F # sono classi non sigillate. in tal caso, posso ereditare un tipo di record? Ad esempio:Eredita record F #

type person = {name:string; address:string} 
type employee inherit person = {employeeId: string} 

Ho cercato tra i documenti MSDN e le specifiche del linguaggio e non sto avendo fortuna. Grazie in anticipo

+0

Offtopic ma non lasciare che la persona ereditaria dei dipendenti :-) –

+0

Ho questo adesso: impiegato {persona: Persona; ecc.} che è corretto secondo Tomas P. Stavo solo vedendo in quale altro modo farlo. :-) –

risposta

20

F # record non possono essere ereditate - come cita Matteo, che vengono compilati a classi sigillate, ma è anche un aspetto del sistema di tipi F # che semplicemente non lo consente.

In pratica, si potrebbe andare con una dichiarazione di classe ordinaria. Questo significa che non sarà in grado di utilizzare la sintassi { person with ... } e non sarà possibile ottenere l'uguaglianza strutturale automatica, ma potrebbe avere senso se si desidera creare codice C# -friendly:

type Person(name:string) = 
    member x.Name = name 

type Employee(name:string, id:int) = 
    inherit Person(name) 
    member x.ID = id 

Penso che la opzione preferita sarebbe quella di utilizzare composizione piuttosto che eredità e rendere dipendente un disco che si compone di alcune informazioni personali e ID:

type PersonalInformation = { Name : string } 

type Employee = 
    { Person : PersonalInformation 
    ID : int } 

probabilmente non fare una persona un par t di dipendente (che non mi sembra giusto, ma è solo un'intuizione), motivo per cui l'ho rinominato in PersonalInformation qui.

suppongo un'altra opzione sarebbe quella di avere IPerson come interfaccia e hanno un record di Employee che implementa l'interfaccia:

type IPerson = 
    abstract Name : string 

type Employee = 
    { ID : int 
    Name : string } 
    interface IPerson with 
    member x.Name = x.Name 

Quale è la migliore in realtà dipende dalla cosa concreta che sei modellazione . Ma penso che le interfacce e la composizione siano generalmente preferite in F # :-)

8

Sono sigillati classi, ecco le prime righe della classe che ha generato per person:

[CompilationMapping(SourceConstructFlags.RecordType)] 
[Serializable] 
public sealed class person 
: IEquatable<person>, 
    IStructuralEquatable, 
    IComparable<person>, 
    IComparable, 
    IStructuralComparable 
Problemi correlati