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 # :-)
fonte
2014-12-02 15:31:24
Offtopic ma non lasciare che la persona ereditaria dei dipendenti :-) –
Ho questo adesso: impiegato {persona: Persona; ecc.} che è corretto secondo Tomas P. Stavo solo vedendo in quale altro modo farlo. :-) –