2014-12-02 19 views
5

Hiểu biết của tôi là các bản ghi F # là các lớp không bị niêm phong. nếu có, tôi có thể kế thừa một loại bản ghi không? Ví dụ:Kế thừa F # Record

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

Tôi đã tìm kiếm các tài liệu và thông số ngôn ngữ MSDN và tôi không có may mắn. Cảm ơn trước

+0

Offtopic nhưng không cho phép nhân viên kế thừa người :-) –

+0

Tôi có quyền này ngay bây giờ: employee {person: Person; vv ..} là thích hợp theo Tomas P. Tôi chỉ nhìn thấy cách khác để làm điều đó. :-) –

Trả lời

20

F # hồ sơ không thể được thừa hưởng - như Matthew đề cập đến, họ được biên soạn để các lớp niêm phong, nhưng nó cũng là một khía cạnh của hệ thống kiểu F # mà đơn giản là không cho phép điều này.

Trong thực tế, bạn có thể đi kèm với tuyên bố lớp học thông thường. Điều này có nghĩa rằng bạn sẽ không thể sử dụng cú pháp { person with ... } và bạn sẽ không nhận được sự bình đẳng về cơ cấu tự động, nhưng nó có thể có ý nghĩa nếu bạn muốn tạo mã C# -friendly:

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

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

Tôi nghĩ rằng lựa chọn ưa thích sẽ được sử dụng phần hơn thừa kế và làm cho người lao động một kỷ lục mà bao gồm một số thông tin cá nhân và ID:

type PersonalInformation = { Name : string } 

type Employee = 
    { Person : PersonalInformation 
    ID : int } 

tôi có lẽ sẽ không làm cho một người một mệnh t của nhân viên (điều đó không cảm thấy đúng đối với tôi, nhưng đó chỉ là trực giác), đó là lý do tại sao tôi đổi tên thành PersonalInformation tại đây.

Tôi cho rằng tùy chọn khác sẽ có IPerson như một giao diện và có một kỷ lụcEmployee thực hiện giao diện:

type IPerson = 
    abstract Name : string 

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

Cái nào là tốt nhất thực sự phụ thuộc vào các điều cụ thể mà bạn đang xây dựng mô hình . Nhưng tôi nghĩ giao diện và bố cục thường được ưu tiên trong F # :-)

8

Họ được niêm phong các lớp học, sau đây là vài dòng đầu tiên của lớp học đó là tạo ra cho person:

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