2014-12-02 57 views
5

我的理解是F#記錄是非密封類。如果是這樣,我可以繼承一個記錄類型嗎?例如:繼承F#記錄

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

我有搜索MSDN文檔和語言規範,我沒有任何運氣。 在此先感謝

+0

Offtopic,但不要讓員工繼承人:-) – 2014-12-02 15:16:15

+0

我現在有這個權利:employee {person:Person;根據Tomas P.,這是正確的。我只是看到了如何去做。 :-) – 2014-12-02 15:18:55

回答

20

F#記錄不能被繼承 - 馬修提到,他們被編譯成密封類,但它也是F#類型系統的一個方面,它根本不允許這樣做。

實際上,您可以使用普通的類聲明。這意味着您將無法使用{ person with ... }語法,你不會得到自動結構性平等的,但如果你想創建C#代碼 - 友好它可能是有意義:

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

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

我覺得較好的選擇是使用組成而不是繼承和使員工一說是由一些個人信息和ID記錄:

type PersonalInformation = { Name : string } 

type Employee = 
    { Person : PersonalInformation 
    ID : int } 

我可能不會做相提並論t的僱員(這不適合我,但這只是一個直覺),這就是爲什麼我把它改名爲PersonalInformation在這裏。

我想另一種選擇是將有IPerson爲一個接口,有一個記錄Employee實現接口:

type IPerson = 
    abstract Name : string 

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

哪一個是最好的真的取決於你是建模具體的東西。但我認爲界面和組成通常是F#中的首選:-)

8

它們密封類,下面是對person生成的類的前幾行:

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