F # - Lớp học
Lớp là kiểu đại diện cho các đối tượng có thể có thuộc tính, phương thức và sự kiện. 'Chúng được sử dụng để mô hình hóa các hành động, quy trình và bất kỳ thực thể khái niệm nào trong ứng dụng'.
Cú pháp
Cú pháp để xác định một loại lớp như sau:
// Class definition:
type [access-modifier] type-name [type-params] [access-modifier] ( parameter-list ) [ as identifier ] =
[ class ]
[ inherit base-type-name(base-constructor-args) ]
[ let-bindings ]
[ do-bindings ]
member-list
...
[ end ]
// Mutually recursive class definitions:
type [access-modifier] type-name1 ...
and [access-modifier] type-name2 ...
...
Ở đâu,
Các type-namelà bất kỳ số nhận dạng hợp lệ nào. Công cụ sửa đổi quyền truy cập mặc định cho điều này làpublic.
Các type-params mô tả các tham số kiểu chung tùy chọn.
Các parameter-listmô tả các tham số của hàm tạo. Công cụ sửa đổi quyền truy cập mặc định cho hàm tạo chính làpublic.
Các identifier được sử dụng với tùy chọn as từ khóa đặt tên cho biến phiên bản, hoặc self-identifier, có thể được sử dụng trong định nghĩa kiểu để tham chiếu đến thể hiện của kiểu.
Các inherit từ khóa cho phép bạn chỉ định lớp cơ sở cho một lớp.
Các let các ràng buộc cho phép bạn khai báo các trường hoặc giá trị hàm cục bộ cho lớp.
Các do-bindings phần bao gồm mã được thực thi khi xây dựng đối tượng.
Các member-list bao gồm các hàm tạo bổ sung, khai báo phương thức thể hiện và tĩnh, khai báo giao diện, ràng buộc trừu tượng, khai báo thuộc tính và sự kiện.
Các từ khóa class và end đánh dấu bắt đầu và kết thúc định nghĩa là tùy chọn.
Cấu tạo của một lớp
Hàm tạo là mã tạo ra một thể hiện của kiểu lớp.
Trong F #, các hàm tạo hoạt động hơi khác so với các ngôn ngữ .Net khác. Trong định nghĩa lớp, các đối số của hàm tạo chính được mô tả dưới dạng danh sách tham số.
Phần thân của hàm tạo bao gồm let và do ràng buộc.
Bạn có thể thêm các hàm tạo bổ sung bằng cách sử dụng từ khóa mới để thêm một thành viên -
new (argument-list) = constructor-body
Ví dụ sau minh họa khái niệm -
Thí dụ
Chương trình sau tạo một lớp dòng cùng với một hàm tạo tính toán độ dài của dòng khi một đối tượng của lớp được tạo:
type Line = class
val X1 : float
val Y1 : float
val X2 : float
val Y2 : float
new (x1, y1, x2, y2) as this =
{ X1 = x1; Y1 = y1; X2 = x2; Y2 = y2;}
then
printfn " Creating Line: {(%g, %g), (%g, %g)}\nLength: %g"
this.X1 this.Y1 this.X2 this.Y2 this.Length
member x.Length =
let sqr x = x * x
sqrt(sqr(x.X1 - x.X2) + sqr(x.Y1 - x.Y2) )
end
let aLine = new Line(1.0, 1.0, 4.0, 5.0)
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
Creating Line: {(1, 1), (4, 5)}
Length: 5
Let Bindings
Các ràng buộc let trong định nghĩa lớp cho phép bạn xác định các trường riêng và các hàm riêng cho các lớp F #.
type Greetings(name) as gr =
let data = name
do
gr.PrintMessage()
member this.PrintMessage() =
printf "Hello %s\n" data
let gtr = new Greetings("Zara")
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
Hello Zara
Xin lưu ý việc sử dụng tự định danh gr cho Greetings lớp.