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 classend đá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 letdo 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.