Các trường của 1 đối tượng là gì năm 2024
Các lớp cung cấp bản thiết kế để tạo dựng đối tượng. Đối tượng là một thực thể của lớp bao gồm dữ liệu dành riêng cho đối tượng đó. Bạn có thể dùng các đối tượng hoặc thực thể lớp thay thế cho nhau. Show
Tương tự như vậy, hãy tưởng tượng bạn đang xây một ngôi nhà. Giống như bản vẽ của kiến trúc sư, lớp còn được gọi là bản thiết kế. Bản thiết kế tự thân nó không phải là một ngôi nhà mà là hướng dẫn về cách xây nhà. Ngôi nhà là vật thể thực hoặc là một đối tượng được xây dựng dựa trên bản thiết kế. Giống như bản thiết kế nhà, có nhiều phòng được thiết kế với mục đích sử dụng riêng, mỗi phòng có thiết kế và mục đích riêng. Để biết cách thiết kế các lớp, bạn cần làm quen với cách lập trình hướng đối tượng (OOP), một khung hướng dẫn bạn đóng gói dữ liệu, logic và hành vi vào trong đối tượng. OOP giúp bạn đơn giản hoá các vấn đề phức tạp trong thế giới thực thành những đối tượng nhỏ hơn. Có bốn khái niệm cơ bản về OOP mà bạn sẽ tìm hiểu thêm trong lớp học lập trình này:
Cuối cùng, bạn sẽ tìm hiểu về các lớp uỷ quyền thuộc tính. Đây là những lớp cung cấp mã có thể sử dụng lại để quản lý các giá trị thuộc tính bằng một cú pháp ngắn gọn. Trong lớp học lập trình này, bạn sẽ học những khái niệm này khi xây dựng cấu trúc lớp cho ứng dụng nhà thông minh. Điều kiện tiên quyết
Kiến thức bạn sẽ học được
Sản phẩm bạn sẽ tạo ra
Bạn cần có
2. Xác định một lớpKhi xác định một lớp, bạn sẽ chỉ định các thuộc tính và phương thức tất cả đối tượng của lớp đó phải có. Định nghĩa lớp bắt đầu bằng từ khoá
0, theo sau là tên và cặp dấu ngoặc nhọn. Phần cú pháp trước dấu ngoặc nhọn cũng được gọi là tiêu đề lớp. Trong dấu ngoặc nhọn, bạn có thể chỉ định các thuộc tính và hàm cho lớp. Bạn sẽ sớm tìm hiểu về các thuộc tính và hàm. Bạn có thể xem cú pháp của định nghĩa lớp trong sơ đồ này: Dưới đây là những quy ước đặt tên được đề xuất cho một lớp:
Một lớp bao gồm 3 phần chính:
Đây không phải là lần đầu tiên bạn làm việc với các lớp. Trong các lớp học lập trình trước đây, bạn đã tìm hiểu về các loại dữ liệu, chẳng hạn như loại dữ liệu
2,
3,
4 và
5. Các loại dữ liệu này được xác định là lớp trong Kotlin. Khi xác định một biến như trong đoạn mã dưới đây, bạn sẽ tạo một đối tượng của lớp
2. Lớp này được tạo thực thể bằng giá trị
7:
Xác định một lớp
8:
3. Tạo một thực thể của lớpNhư bạn đã biết, lớp là bản thiết kế của một đối tượng. Thời gian chạy Kotlin sử dụng lớp hoặc bản thiết kế để tạo một đối tượng thuộc loại cụ thể đó. Với lớp
8, bạn sẽ có bản thiết kế của một thiết bị thông minh. Để có thiết bị thông minh thực tế trong chương trình, bạn cần tạo một thực thể đối tượng
8. Cú pháp tạo thực thể bắt đầu bằng tên lớp, theo sau là một cặp dấu ngoặc đơn như có thể thấy trong sơ đồ dưới đây: Để sử dụng một đối tượng, bạn sẽ tạo đối tượng và gán đối tượng đó cho một biến, tương tự như cách bạn xác định một biến. Bạn dùng từ khoá
07 để tạo biến không thể thay đổi và từ khoá
08 cho biến có thể thay đổi. Từ khoá
07 hoặc
08 theo sau là tên của biến, sau đó là một toán tử gán
11 rồi đến thực thể của đối tượng lớp. Bạn có thể xem cú pháp trong sơ đồ này: Tạo thực thể lớp
8 dưới dạng một đối tượng:
4. Xác định các phương thức của lớpTrong Bài 1, bạn đã được học về:
Các thao tác lớp có thể thực hiện được xác định là các hàm trong lớp. Ví dụ: hãy tưởng tượng bạn sở hữu một thiết bị thông minh, TV thông minh hoặc đèn thông minh và bạn có thể bật/tắt thiết bị đó bằng điện thoại di động. Thiết bị thông minh này được chuyển thành lớp
8 trong quá trình lập trình. Thao tác bật/tắt thiết bị này sẽ được biểu thị bằng hàm
19 và hàm
20, cho phép kích hoạt hành vi bật/tắt đó. Cú pháp để xác định một hàm trong lớp giống hệt với cú pháp bạn đã học trước đó. Điểm khác biệt duy nhất là hàm được đặt trong phần nội dung của lớp. Khi bạn xác định một hàm trong phần nội dung lớp, hàm đó được gọi là hàm thành phần hoặc phương thức và đại diện cho hành vi của lớp. Trong phần còn lại của lớp học lập trình này, các hàm được gọi là phương thức bất cứ khi nào chúng xuất hiện trong phần nội dung của một lớp. Xác định phương thức
19 và
20 trong lớp
8:
Gọi một phương thức trên một đối tượngCho đến phần này, bạn đã xác định một lớp đóng vai trò là bản thiết kế cho một thiết bị thông minh, tạo một thực thể của lớp và gán thực thể đó cho một biến. Giờ đây, bạn có thể dùng phương thức của lớp
8 để bật và tắt thiết bị. Lệnh gọi một phương thức trong một lớp tương tự như cách bạn gọi các hàm khác từ hàm
8 trong lớp học lập trình trước đó. Ví dụ: nếu cần gọi phương thức
20 từ phương thức
19, bạn có thể viết nội dung tương tự như đoạn mã này:
Để gọi một phương thức lớp bên ngoài lớp, hãy bắt đầu bằng đối tượng lớp theo sau là toán tử
44, tên hàm và một cặp dấu ngoặc đơn. Nếu có thể, dấu ngoặc đơn có chứa các đối số mà phương thức yêu cầu. Bạn có thể xem cú pháp trong sơ đồ này: Gọi phương thức
19 và
20 trên đối tượng:
Kết quả sẽ như sau:
0 5. Xác định các thuộc tính của lớpTrong Bài 1, bạn đã học về các biến, là các vùng chứa cho một phần dữ liệu. Bạn đã tìm hiểu cách tạo một biến chỉ có thể đọc bằng từ khoá
07 và biến có thể thay đổi bằng từ khoá
08. Trong khi phương thức xác định các thao tác một lớp có thể thực hiện, thì các thuộc tính này xác định các đặc điểm hoặc thuộc tính dữ liệu của lớp. Ví dụ: một thiết bị thông minh có các thuộc tính sau:
Về cơ bản, thuộc tính là các biến được xác định trong phần nội dung lớp thay vì phần nội dung hàm. Điều này có nghĩa là cú pháp để xác định thuộc tính và biến giống hệt nhau. Bạn xác định một thuộc tính không thể thay đổi bằng từ khoá
07 và thuộc tính có thể thay đổi bằng từ khoá
08. Triển khai các đặc điểm nói trên dưới dạng thuộc tính của lớp
8:
1
2
3
Kết quả sẽ như sau:
4 Hàm getter và setter trong các thuộc tínhThuộc tính có thể làm được nhiều việc hơn một biến. Ví dụ: giả sử bạn tạo một cấu trúc lớp để đại diện cho một TV thông minh. Một trong những hành động phổ biến bạn thực hiện là tăng và giảm âm lượng. Để thể hiện hành động này trong lập trình, bạn có thể tạo một thuộc tính có tên là
72. Thuộc tính này giữ mức âm lượng hiện tại được đặt trên loa TV, nhưng có phạm vi giá trị cho âm lượng. Âm lượng tối thiểu có thể đặt là 0 và tối đa là 100. Để đảm bảo thuộc tính
72 không bao giờ vượt quá 100 hoặc thấp hơn 0, bạn có thể viết một hàm setter. Khi cập nhật giá trị của thuộc tính, bạn cần kiểm tra xem giá trị đó có nằm trong khoảng từ 0 đến 100 hay không. Một ví dụ khác, hãy tưởng tượng có một yêu cầu để đảm bảo tên luôn phải viết hoa. Bạn có thể triển khai hàm getter để chuyển đổi thuộc tính
58 thành chữ viết hoa. Trước khi tìm hiểu sâu hơn về cách triển khai các thuộc tính này, bạn cần hiểu rõ cú pháp để khai báo thuộc tính. Cú pháp đầy đủ để xác định thuộc tính có thể thay đổi bắt đầu bằng định nghĩa biến, theo sau là các hàm
75 và
76 (không bắt buộc). Bạn có thể xem cú pháp trong sơ đồ này: Khi bạn không xác định hàm getter và setter cho một thuộc tính, trình biên dịch Kotlin sẽ tạo các hàm đó trong nội bộ. Ví dụ: nếu bạn sử dụng từ khoá
08 để xác định một thuộc tính
72 và gán một giá trị
79 cho thuộc tính đó, trình biên dịch sẽ tự động tạo các hàm getter và setter như có thể thấy trong đoạn mã dưới đây:
5 Bạn sẽ không thấy những dòng này trong mã vì trình biên dịch đã thêm chúng vào nền. Cú pháp đầy đủ cho thuộc tính không thể thay đổi có hai điểm khác biệt:
Thuộc tính Kotlin sử dụng trường sao lưu để lưu giữ giá trị trong bộ nhớ. Trường sao lưu về cơ bản là một biến lớp được xác định nội bộ bên trong các thuộc tính. Trường sao lưu nằm trong phạm vi một thuộc tính, có nghĩa là bạn chỉ có thể truy cập vào trường đó thông qua các hàm thuộc tính
75 hoặc
76. Để đọc giá trị thuộc tính trong hàm
75 hoặc cập nhật giá trị trong hàm
76, bạn cần sử dụng trường sao lưu của thuộc tính. Tệp này được trình biên dịch Kotlin tạo tự động và được tham chiếu bằng giá trị nhận dạng
87. Ví dụ: khi muốn cập nhật giá trị của thuộc tính trong hàm
76, bạn sử dụng tham số của hàm
76 (còn được gọi là tham số
87 biến như bạn có thể thấy trong đoạn mã này:
6 Ví dụ: để đảm bảo giá trị được gán cho thuộc tính
72 nằm trong khoảng từ 0 đến 100, bạn có thể triển khai hàm setter như có thể thấy trong đoạn mã dưới đây:
7 Hàm
76 kiểm tra xem giá trị
2 có nằm trong phạm vi từ 0 đến 100 hay không bằng cách dùng từ khoá
95 theo sau là phạm vi giá trị. Nếu giá trị nằm trong phạm vi dự kiến, thì giá trị
87 sẽ được cập nhật. Nếu không, giá trị của thuộc tính sẽ không thay đổi. Bạn sẽ thêm thuộc tính này vào một lớp trong phần Triển khai mối quan hệ giữa các lớp của lớp học lập trình này, vì vậy, hiện tại bạn chưa cần phải thêm hàm setter vào mã. 6. Xác định hàm khởi tạoMục đích chính của hàm khởi tạo là chỉ định cách các đối tượng của lớp được tạo. Nói cách khác, hàm khởi tạo sẽ tạo một đối tượng và khiến đối tượng đó sẵn sàng để sử dụng. Bạn làm việc này khi tạo thực thể cho đối tượng. Mã bên trong hàm khởi tạo thực thi khi đối tượng của lớp được tạo thực thể. Bạn có thể xác định một hàm khởi tạo có hoặc không có tham số. Hàm khởi tạo mặc địnhHàm khởi tạo mặc định là hàm khởi tạo không có tham số. Bạn có thể xác định một hàm khởi tạo mặc định như trong đoạn mã này:
8 Kotlin luôn hướng đến sự súc tích, vì vậy bạn có thể xoá từ khoá
97 nếu không có chú thích hoặc công cụ sửa đổi chế độ hiển thị (bạn sẽ sớm được tìm hiểu về nó) trên hàm khởi tạo. Bạn cũng có thể xoá dấu ngoặc đơn nếu hàm khởi tạo không có tham số như minh hoạ trong đoạn mã dưới đây:
9 Trình biên dịch Kotlin sẽ tự động tạo hàm khởi tạo mặc định. Bạn sẽ không thấy hàm khởi tạo mặc định được tạo tự động trong mã vì hàm đó đã được trình biên dịch thêm vào trong nền. Xác định một hàm khởi tạo có tham sốTrong lớp
8, các thuộc tính
58 và
62 là không thể thay đổi. Bạn cần đảm bảo tất cả các thực thể của lớp
8 đều khởi tạo các thuộc tính
58 và
62. Bằng cách triển khai hiện tại, các giá trị của thuộc tính
58 và
62 đã được mã hóa cứng. Điều này có nghĩa là tất cả thiết bị thông minh được đặt tên bằng chuỗi
59
60 và được phân loại bằng chuỗi
63. Để duy trì tính bất biến nhưng tránh các giá trị được mã hoá cứng, hãy dùng một hàm khởi tạo có tham số để tạo các giá trị đó:
0 Hàm khởi tạo hiện chấp nhận các tham số để thiết lập thuộc tính, vì vậy, cách tạo thực thể của một đối tượng cho lớp đó cũng sẽ thay đổi. Bạn có thể xem cú pháp đầy đủ để tạo thực thể cho một đối tượng trong sơ đồ này: Dưới đây là nội dung biểu thị dòng mã:
1 Cả hai đối số cho hàm khởi tạo đều là chuỗi. Nó không rõ ràng về giá trị cần chỉ định cho tham số. Để khắc phục lỗi này, tương tự như cách bạn chuyển các đối số của hàm, bạn có thể tạo một hàm khởi tạo có đối số được đặt tên như minh hoạ trong đoạn mã dưới đây:
2 Có hai loại hàm khởi tạo chính trong Kotlin:
Bạn có thể dùng hàm khởi tạo chính để tạo các thuộc tính trong tiêu đề lớp. Các đối số được chuyển đến hàm khởi tạo được gán cho các thuộc tính. Cú pháp để xác định một hàm khởi tạo chính bắt đầu bằng tên lớp, theo sau là từ khoá
97 và một cặp dấu ngoặc đơn. Dấu ngoặc đơn chứa các tham số cho hàm khởi tạo chính. Nếu có nhiều hơn một tham số, dấu phẩy sẽ phân tách các định nghĩa tham số. Bạn có thể xem cú pháp đầy đủ để xác định một hàm khởi tạo chính trong sơ đồ này: Hàm khởi tạo phụ nằm trong phần nội dung của lớp và cú pháp của hàm này bao gồm 3 phần:
Bạn có thể xem cú pháp trong sơ đồ này: Ví dụ: giả sử bạn muốn tích hợp API do một nhà cung cấp thiết bị thông minh phát triển. Tuy nhiên, API sẽ trả về mã trạng thái của loại
2 để cho biết trạng thái thiết bị ban đầu. API trả về một giá trị
16 nếu thiết bị ngoại tuyến và một giá trị
7 nếu thiết bị đó trực tuyến. Đối với bất kỳ giá trị số nguyên nào khác, trạng thái được coi là không xác định. Bạn có thể tạo một hàm khởi tạo phụ trong lớp
8 để chuyển đổi tham số
19 này thành giá trị biểu diễn dạng chuỗi như có thể thấy trong đoạn mã dưới đây:
3 7. Triển khai mối quan hệ giữa các lớpTính kế thừa cho phép bạn tạo một lớp dựa trên đặc điểm và hành vi của một lớp khác. Đây là một cơ chế hiệu quả giúp bạn viết mã có thể sử dụng lại và thiết lập mối quan hệ giữa các lớp. Ví dụ: có nhiều thiết bị thông minh trên thị trường, chẳng hạn như TV thông minh, đèn thông minh và công tắc thông minh. Khi bạn biểu diễn các thiết bị thông minh trong lập trình, chúng sẽ dùng chung một số thuộc tính như tên, danh mục và trạng thái. Chúng cũng có các hành vi phổ biến, chẳng hạn như khả năng bật và tắt những tuỳ chọn đó. Tuy nhiên, cách bật hoặc tắt từng thiết bị thông minh sẽ khác nhau. Ví dụ: để bật TV, bạn có thể phải bật màn hình, sau đó thiết lập mức âm lượng và kênh đã mở lần gần nhất. Mặt khác, để bật đèn, bạn có thể chỉ cần tăng hoặc giảm độ sáng. Ngoài ra, mỗi thiết bị thông minh có nhiều chức năng và thao tác thực hiện hơn. Ví dụ: đối với TV, bạn có thể điều chỉnh âm lượng và thay đổi kênh. Với đèn, bạn có thể điều chỉnh độ sáng hoặc màu sắc. Tóm lại, tất cả các thiết bị thông minh đều có các tính năng khác nhau, nhưng có chung một số đặc điểm. Bạn có thể sao chép các đặc điểm chung này tới từng lớp thiết bị thông minh hoặc làm cho mã có thể tái sử dụng với tính kế thừa. Để làm việc này, bạn cần tạo một lớp mẹ
8 và xác định các thuộc tính cũng như hành vi phổ biến này. Sau đó, bạn có thể tạo các lớp con, chẳng hạn như lớp
21 và
22. Các lớp này kế thừa các thuộc tính của lớp cha. Trong các ngôn ngữ lập trình, chúng ta nói lớp
21 và
22 mở rộng lớp mẹ
8. Lớp mẹ còn được gọi là lớp cấp cao và lớp con là lớp phụ. Bạn có thể thấy mối quan hệ giữa chúng trong sơ đồ này: Tuy nhiên, trong Kotlin, theo mặc định, tất cả các lớp đều là cuối cùng, nghĩa là bạn không thể mở rộng chúng, vì vậy bạn phải xác định mối quan hệ giữa các lớp. Xác định mối quan hệ giữa lớp cấp cao
8 và các lớp con của chúng:
4 Từ khoá
28 thông báo cho trình biên dịch rằng lớp này có thể mở rộng. Nhờ đó, vào lúc này lớp khác sẽ có thể mở rộng lớp này. Cú pháp để tạo lớp con bắt đầu bằng việc tạo tiêu đề lớp như bạn đã làm từ trước đến nay. Sau dấu ngoặc đơn đóng của hàm khởi tạo là dấu cách, dấu hai chấm, dấu cách khác, tên lớp cấp cao và một cặp dấu ngoặc đơn. Nếu cần, dấu ngoặc đơn sẽ bao gồm các tham số mà hàm khởi tạo lớp cấp cao yêu cầu. Bạn có thể xem cú pháp trong sơ đồ này:
5 Việc xác định
97 cho
21 không chỉ định xem các thuộc tính này có thể thay đổi hay không thể thay đổi. Điều này có nghĩa là tham số
35 và
36 chỉ là tham số
97 hơn là thuộc tính lớp. Bạn sẽ không thể dùng chúng trong lớp này, chỉ cần chuyển các lớp đó đến hàm khởi tạo lớp cấp cao.
6
7
8
9
0
1
2 Mối quan hệ giữa các lớpKhi sử dụng tính kế thừa, bạn thiết lập mối quan hệ giữa hai lớp trong mối quan hệ IS-A. Đối tượng cũng là một thực thể của lớp, từ đó đối tượng này kế thừa. Trong mối quan hệ HAS-A, một đối tượng có thể sở hữu một thực thể của lớp khác mà không thực sự là thực thể của lớp đó. Bạn có thể thấy phần biểu thị cấp cao về các mối quan hệ trong sơ đồ dưới đây: Mối quan hệ IS-AKhi bạn chỉ định mối quan hệ IS-A giữa lớp cấp cao
8 và lớp con
21, điều đó có nghĩa là lớp con
21 có thể làm bất cứ điều gì mà lớp cấp cao
8 làm được. Mối quan hệ này là một chiều, vì vậy mỗi TV thông minh là một thiết bị thông minh nhưng mỗi thiết bị thông minh không hẳn đều là TV thông minh. Mã biểu thị cho mối quan hệ IS-A được minh hoạ trong đoạn mã dưới đây:
3 Không sử dụng tính kế thừa chỉ để đạt được tính tái sử dụng mã. Trước khi bạn quyết định, hãy kiểm tra xem hai lớp có liên quan với nhau hay không. Nếu chúng có thể hiện một số mối quan hệ, hãy kiểm tra xem chúng có thực sự đủ điều kiện để thiết lập mối quan hệ IS-A hay không. Hãy tự hỏi: "Lớp con có phải là lớp cấp cao không?". Ví dụ: Android là một hệ điều hành. Mối quan hệ HAS-AMối quan hệ HAS-A là một cách khác để chỉ định mối quan hệ giữa hai lớp. Ví dụ: bạn có thể đang sử dụng TV thông minh tại nhà của mình. Trong trường hợp này, có mối quan hệ giữa TV thông minh và nhà bạn. Nhà này có chứa một thiết bị thông minh, hoặc nói cách khác là nhà có mộtthiết bị thông minh. Mối quan hệ HAS-A giữa hai lớp cũng được gọi là sự kết hợp. Cho đến nay, bạn đã tạo được một vài thiết bị thông minh. Bây giờ, bạn sẽ tạo lớp
71, chứa các thiết bị thông minh. Lớp
71 cho phép bạn tương tác với các thiết bị thông minh. Sử dụng mối quan hệ HAS-A để xác định lớp
71:
4
5
6
7
8
9
0
1
2
3 Ghi đè phương thức của lớp cấp cao từ các lớp conNhư đã thảo luận trước đó, mặc dù chức năng bật và tắt được tất cả các thiết bị thông minh hỗ trợ, nhưng cách thực hiện chức năng này lại khác nhau. Để cung cấp hành vi dành riêng cho thiết bị này, bạn cần ghi đè phương thức
19 và
20 được xác định trong lớp cấp cao. Để ghi đè nghĩa là chặn hành động, thường là để kiểm soát thủ công. Khi bạn ghi đè một phương thức, phương thức trong lớp con sẽ làm gián đoạn quá trình thực thi phương thức được xác định trong lớp cấp cao và cung cấp phương thức thực thi của chính nó. Ghi đè lớp
8 phương thức
19 và
20:
4
5
6
7
8
9 Từ khoá
57 thông báo cho Kotlin trong thời gian chạy để thực thi mã có trong phương thức đã xác định trong lớp con.
0
1
2
3
4
5
6
Kết quả sẽ như sau:
7
8
Kết quả sẽ như sau:
9 Đây là một ví dụ về tính đa hình. Mã này gọi phương thức
19 trên biến thuộc loại
8 và tuỳ thuộc vào giá trị thực tế của biến đó, bạn có thể thực thi các quy trình triển khai khác nhau của phương thức
19. Sử dụng lại mã lớp cấp cao trong các lớp con bằng từ khoá
03 Khi xem xét kỹ phương thức
19 và
20, bạn nhận thấy biến
64 có điểm giống nhau trong cách nó được cập nhật, bất cứ khi nào phương thức được gọi trong lớp con
21 và
22: mã bị trùng lặp. Bạn có thể sử dụng lại mã khi cập nhật trạng thái trong lớp
8. Để gọi phương thức bị ghi đè trong lớp cấp cao từ lớp con, bạn cần sử dụng từ khoá
03. Việc gọi một phương thức từ lớp cấp cao cũng tương tự như gọi phương thức từ bên ngoài lớp. Thay vì dùng toán tử
44 giữa đối tượng và phương thức, bạn cần dùng từ khoá
03 để thông báo cho trình biên dịch Kotlin gọi phương thức trên lớp cấp cao thay vì lớp con. Cú pháp để gọi phương thức từ lớp cấp cao bắt đầu bằng từ khoá
03, theo sau là toán tử
44, tên hàm và một cặp dấu ngoặc đơn. Nếu có thể, dấu ngoặc đơn có bao gồm các đối số. Bạn có thể xem cú pháp trong sơ đồ này: Sử dụng lại mã trong lớp cấp cao
8:
0
1
2 Ghi đè các thuộc tính lớp cấp cao từ lớp conTương tự như phương thức, bạn cũng có thể ghi đè các thuộc tính theo các bước tương tự. Ghi đè thuộc tính
26:
3
4
5 8. Đối tượng sửa đổi chế độ hiển thịHệ số sửa đổi chế độ hiển thị đóng vai trò quan trọng để hoàn thiện đóng gói:
Kotlin cung cấp 4 hệ số sửa đổi chế độ hiển thị:
Có một số thuộc tính và phương thức chỉ được dùng bên trong lớp đó và bạn không nhất thiết muốn các lớp khác sử dụng. Bạn có thể đánh dấu các thuộc tính và phương thức này bằng đối tượng sửa đổi chế độ hiển thị
46 để đảm bảo một lớp khác không thể vô tình truy cập vào.
Khi bạn xác định một lớp, lớp này sẽ hiển thị công khai và bất kỳ gói nào nhập lớp đều có thể truy cập, tức là lớp đó ở chế độ công khai theo mặc định, trừ khi bạn chỉ định đối tượng sửa đổi chế độ hiển thị. Tương tự, khi bạn xác định hoặc khai báo các thuộc tính và phương thức trong lớp, theo mặc định, những thuộc tính và phương thức này có thể được truy cập bên ngoài lớp thông qua đối tượng lớp. Điều cần thiết là phải xác định chế độ hiển thị thích hợp cho mã, chủ yếu để ẩn các thuộc tính và phương thức các lớp khác không cần thiết truy cập. Ví dụ: hãy xem cách người lái xe có thể sử dụng ô tô. Theo mặc định, những chi tiết bộ phận tạo nên một chiếc xe ô tô và cách xe hoạt động được ẩn giấu bên trong. Chiếc xe ô tô được thiết kế để vận hành trực quan nhất có thể. Bạn không muốn ô tô hoạt động phức tạp như một máy bay thương mại, tương tự như việc bạn không muốn một nhà phát triển khác hoặc bản thân bạn trong tương lai bị nhầm lẫn về cách sử dụng thuộc tính và phương pháp của một lớp. Đối tượng sửa đổi chế độ hiển thị giúp bạn hiển thị các phần mã liên quan đến các lớp khác trong dự án và đảm bảo loại trừ việc triển khai một cách vô tình, điều này giúp mã dễ hiểu và ít xảy ra lỗi hơn. Bạn phải đặt đối tượng sửa đổi chế độ hiển thị trước cú pháp khai báo, đồng thời khai báo lớp, phương thức hoặc thuộc tính như có thể thấy trong sơ đồ dưới đây: Xác định đối tượng sửa đổi chế độ hiển thị cho các thuộc tínhCú pháp để xác định đối tượng sửa đổi chế độ hiển thị cho một thuộc tính bắt đầu bằng đối tượng sửa đổi
46,
48 hoặc
50, theo sau là cú pháp xác định thuộc tính. Bạn có thể xem cú pháp trong sơ đồ này: Ví dụ: bạn có thể xem cách thiết lập thuộc tính
64 thành riêng tư trong đoạn mã này:
6 Bạn cũng có thể đặt hệ số sửa đổi chế độ hiển thị thành các hàm setter. Đối tượng sửa đổi được đặt trước từ khoá
55. Bạn có thể xem cú pháp trong sơ đồ này: Đối với lớp
8, giá trị của thuộc tính
64 phải đọc được bên ngoài lớp thông qua các đối tượng lớp. Tuy nhiên, chỉ có lớp và các lớp con mới có thể cập nhật hoặc ghi giá trị. Để triển khai yêu cầu này, bạn cần phải sử dụng đối tượng sửa đổi
48 trên hàm
76 của thuộc tính
64. Dùng đối tượng sửa đổi
48 trên hàm
76 của thuộc tính
64:
7 Bạn hiện không thực hiện bất kỳ hành động hoặc bước kiểm tra nào trong hàm
76. Bạn chỉ cần chỉ định tham số
90 cho biến
87. Như bạn đã được học, điều này tương tự như cách triển khai mặc định cho phương thức setter thuộc tính. Trong trường hợp này, bạn có thể bỏ qua dấu ngoặc đơn và nội dung của hàm
76:
8
9
0 Chỉ định truy cập cho các phương thứcCú pháp để chỉ định một đối tượng sửa đổi mức độ hiển thị cho một phương thức bắt đầu bằng đối tượng sửa đổi
46,
48 hoặc
50, theo sau là cú pháp xác định một phương thức. Bạn có thể xem cú pháp trong sơ đồ này: Ví dụ: bạn có thể xem cách chỉ định một đối tượng sửa đổi
48 cho phương thức
49 trong lớp
21 trong đoạn mã này:
1 Đối tượng sửa đổi chế độ hiển thị cho các hàm khởi tạoCú pháp để chỉ định đối tượng sửa đổi chế độ hiển thị cho hàm khởi tạo tương tự như cách xác định hàm khởi tạo chính với một vài điểm khác biệt:
Bạn có thể xem cú pháp trong sơ đồ này: Ví dụ: bạn có thể xem cách thêm đối tượng sửa đổi
48 vào hàm khởi tạo
8 trong đoạn mã dưới đây:
2 Đối tượng sửa đổi chế độ hiển thị cho các lớpCú pháp để chỉ định đối tượng sửa đổi chế độ hiển thị cho một lớp bắt đầu bằng đối tượng sửa đổi
46,
48 hoặc
50, theo sau là cú pháp xác định một lớp. Bạn có thể xem cú pháp trong sơ đồ này: Ví dụ: bạn có thể xem cách chỉ định đối tượng sửa đổi
50 cho lớp
8 trong đoạn mã dưới đây:
3 Tốt nhất là bạn nên cố gắng hiển thị nghiêm ngặt các thuộc tính và phương thức, vì vậy, hãy khai báo chúng bằng đối tượng sửa đổi
46 thường xuyên nhất có thể. Nếu bạn không thể đặt những email này ở chế độ riêng tư, hãy dùng hệ số sửa đổi
48. Nếu bạn không thể bảo vệ những dữ liệu đó, hãy dùng hệ số sửa đổi
50. Nếu bạn không thể giữ chúng trong nội bộ, hãy sử dụng hệ số sửa đổi
45. Chỉ định đối tượng sửa đổi chế độ hiển thị phù hợpBảng này giúp bạn xác định đối tượng sửa đổi chế độ hiển thị phù hợp dựa trên vị trí mà thuộc tính hay phương thức của một lớp hoặc hàm khởi tạo có thể truy cập được: Ký tự bổ trợ Có thể truy cập trong cùng một lớp Có thể truy cập trong lớp con Có thể truy cập được trong cùng mô-đun Có thể truy cập ô-đun bên ngoài
46 ✔ 𝗫 𝗫 𝗫
48 ✔ ✔ 𝗫 𝗫
50 ✔ ✔ ✔ 𝗫
45 ✔ ✔ ✔ ✔ Trong lớp con
21, bạn không nên cho phép kiểm soát các thuộc tính
72 và
40 từ bên ngoài lớp. Bạn chỉ nên kiểm soát các thuộc tính này thông qua các phương thức
43 và
49. Tương tự, trong lớp con
22, thuộc tính
59 chỉ nên được kiểm soát thông qua phương thức
10. Thêm hệ số xác định mức độ hiển thị phù hợp vào các lớp con
21 và
22:
4
5 9. Xác định lớp uỷ quyền thuộc tínhBạn đã tìm hiểu trong phần trước rằng các thuộc tính trong Kotlin sử dụng một trường sao lưu để lưu giữ giá trị của các thuộc tính đó trong bộ nhớ. Bạn sử dụng mã nhận dạng
87 để tham chiếu mã này. Khi xem mã cho đến thời điểm, bạn có thể thấy nhân bản mã để kiểm tra xem liệu các giá trị có nằm trong phạm vi cho thuộc tính
72,
40 và
59 trong lớp
21 và
22. Bạn có thể sử dụng lại mã kiểm tra phạm vi trong hàm setter bằng lệnh ủy quyền. Thay vì sử dụng một trường, cũng như một hàm getter và setter để quản lý giá trị, lớp uỷ quyền sẽ quản lý giá trị đó. Cú pháp để tạo uỷ quyền thuộc tính bắt đầu bằng phần khai báo một biến theo sau là từ khoá
9 và đối tượng uỷ quyền xử lý các hàm setter và getter cho thuộc tính. Bạn có thể xem cú pháp trong sơ đồ này: Trước khi triển khai lớp mà bạn có thể uỷ quyền để triển khai, bạn cần làm quen với giao diện. Giao diện là một "hợp đồng" mà các lớp triển khai nó này cần phải tuân thủ. Nó tập trung vào việc nên làm thay vì cách thực hiện hành động. Tóm lại, giao diện sẽ giúp bạn đạt được sự trừu tượng. Ví dụ: trước khi xây nhà, bạn phải thông tin cho kiến trúc sư về những gì bạn muốn. Bạn muốn có phòng ngủ, phòng cho trẻ em, phòng khách, bếp và một vài phòng tắm. Một cách ngắn gọn, bạn xác định những điều bạn muốn và kiến trúc sư chỉ định cách đạt được mục tiêu này. Bạn có thể xem cú pháp để tạo giao diện trong sơ đồ này: Bạn đã biết cách mở rộng lớp và ghi đè chức năng của lớp đó. Với các giao diện, lớp triển khai giao diện. Lớp cung cấp thông tin triển khai cho các phương thức và thuộc tính được khai báo trong giao diện. Bạn sẽ thực hiện một thao tác tương tự với giao diện
30 để tạo lớp uỷ quyền. Bạn sẽ tìm hiểu thêm về các giao diện trong bài sau. Để tạo lớp ủy quyền cho loại
08, bạn cần triển khai giao diện
30. Tương tự, bạn cần triển khai giao diện
33 cho loại
07. Tạo ủy quyền cho loại
08:
6 Đừng lo lắng về dấu ngoặc nhọn hoặc nội dung bên trong nó. Chúng biểu thị các loại chung và bạn sẽ tìm hiểu về chúng trong bài tiếp theo.
7
8 Các phương thức này đóng vai trò là hàm getter và setter của các thuộc tính.
9
0 Thuộc tính này đóng vai trò là trường sao lưu cho biến.
1
2
3
4 10. Thử nghiệm giải phápBạn có thể xem mã giải pháp trong đoạn mã này:
5 Kết quả sẽ như sau:
9 11. Tham gia thử thách này
Sau khi bạn hoàn tất việc triển khai:
12. Kết luậnXin chúc mừng! Bạn đã được học cách xác định lớp và tạo bản sao đối tượng . Bạn cũng đã được học cách tạo mối quan hệ giữa các lớp và uỷ quyền thuộc tính. Tóm tắt
Tìm hiểu thêm
Trừ khi có lưu ý khác, nội dung của trang này được cấp phép theo Giấy phép ghi nhận tác giả 4.0 của Creative Commons và các mẫu mã lập trình được cấp phép theo Giấy phép Apache 2.0. Để biết thông tin chi tiết, vui lòng tham khảo Chính sách trang web của Google Developers. Java là nhãn hiệu đã đăng ký của Oracle và/hoặc các đơn vị liên kết với Oracle. [{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Thiếu thông tin tôi cần" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Quá phức tạp/quá nhiều bước" },{ "type": "thumb-down", "id": "outOfDate", "label":"Đã lỗi thời" },{ "type": "thumb-down", "id": "translationIssue", "label":"Vấn đề về bản dịch" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Vấn đề về mẫu/mã" },{ "type": "thumb-down", "id": "otherDown", "label":"Khác" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Dễ hiểu" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Giúp tôi giải quyết được vấn đề" },{ "type": "thumb-up", "id": "otherUp", "label":"Khác" }] |