Sử dụng tủ chứa đồ để thu xếp ngăn nắp các trang Lưu và phân một số loại nội dung dựa vào lựa chọn ưu tiên của bạn.

1. Trước khi bước đầu

Lớp học tập lập trình này phía dẫn bạn cách sử dụng những lớp và đối tượng người tiêu dùng trong Kotlin.

Bạn đang xem: Cách dùng từ đối tượng

Các lớp cung cấp bản thiết kế để chế tác dựng các đối tượng. Đối tượng là 1 trong những thực thể của lớp bao gồm dữ liệu giành cho đối tượng đó. Chúng ta có thể dùng các đối tượng người sử dụng hoặc thực thể lớp thay thế cho nhau.

Tương tự như vậy, hãy tưởng tượng bạn đang xây một ngôi nhà. Tương tự như bản vẽ của phong cách xây dựng sư, lớp còn gọi là bản thiết kế. Bạn dạng thiết kế từ bỏ thân nó không phải là 1 ngôi đơn vị mà là phía dẫn về cách xây nhà. Ngôi nhà là đồ dùng thể thực hay là một đối tượng người tiêu dùng được xây dừng dựa trên bản thiết kế.

Giống như phiên bản thiết kế nhà, có tương đối nhiều phòng được thiết kế theo phong cách với mục đích sử dụng riêng, từng phòng được thiết kế theo phong cách và mục tiêu riêng. Để biết cách xây đắp các lớp, bạn phải làm quen với bí quyết lập trình hướng đối tượng người dùng (OOP), một khung hướng dẫn chúng ta đính kèm dữ liệu, súc tích và hành vi trong những đối tượng.

OOP giúp bạn đơn giản hóa những vấn đề tinh vi trong nhân loại thực thành các đối tượng nhỏ hơn. Có bốn tư tưởng cơ bạn dạng về OOP mà bạn sẽ đọc thêm trong lớp học lập trình này:

Đóng gói. bao hàm các trực thuộc tính và phương thức tương quan giúp thực hiện hành động trên những thuộc tính kia trong một lớp. Lấy điện thoại thông minh di động của người sử dụng làm ví dụ. Thành phầm này bao gồm một máy ảnh, màn hình, thẻ nhớ cùng một vài phần cứng và phần mềm khác. Các bạn không cần phải lo ngại về cách những thành phần bên trong kết hợp với nhau.Tính trừu tượng. Là phần mở rộng của việc đóng gói. Với mục tiêu là ẩn ngắn gọn xúc tích triển khai bên trong càng nhiều càng tốt. Ví dụ: nhằm chụp hình ảnh bằng điện thoại cảm ứng thông minh di động, bạn chỉ việc mở áp dụng máy ảnh, hướng smartphone đến nơi ý muốn chụp cùng nhấp vào nút để chụp ảnh. Bạn không cần phải biết cách cải tiến và phát triển ứng dụng máy ảnh hoặc phần cứng máy hình ảnh trên smartphone di đụng thực tế vận động như nỗ lực nào. Nắm lại, phép tắc nội bộ của vận dụng máy ảnh và giải pháp máy ảnh trên thiết bị di động cầm tay chụp hình ảnh sẽ được trừu tượng hóa nhằm bạn thực hiện các tác vụ đề nghị thiết.Tính kế thừa (inheritance). Cho phép bạn chế tác lớp dựa trên đặc điểm và hành vi của các lớp khác bằng phương pháp thiết lập mối quan hệ mẹ-con. Ví dụ: có tương đối nhiều nhà sản xuất chế tạo ra nhiều thiết bị di động cầm tay chạy game chuyenly.edu.vn OS nhưng lại giao diện người tiêu dùng cho từng vật dụng là khác nhau. Một cách khác, bên sản xuất kế thừa tính năng hệ quản lý và điều hành chuyenly.edu.vn và tạo các cấu hình thiết lập của họ dựa vào tính năng đó.Tính đa hình. từ này được rộp theo với có nguồn gốc từ Hy Lạp poly-, tức là nhiều, và -morphism, là những dạng. Tính đa hình là tài năng sử dụng các đối tượng người tiêu dùng khác nhau theo một phương pháp chung. Ví dụ: khi bạn kết nối loa công nghệ bluetooth với điện thoại cảm ứng di động, smartphone chỉ nên biết có một thiết bị rất có thể phát music bằng Bluetooth. Tuy nhiên, có tương đối nhiều loa bluetooth không dây để bạn chọn và điện thoại không cần phải biết cụ thể cách làm việc với từng loa.

Cuối cùng, bạn sẽ tìm phát âm về uỷ quyền ở trong tính, tính năng hỗ trợ mã hoàn toàn có thể sử dụng lại để thống trị các giá trị thuộc tính bằng một cú pháp súc tích. Trong lớp học lập trình này, các bạn sẽ học những khái niệm này khi xây dựng cấu trúc lớp mang đến ứng dụng thông nhà minh.

Lưu ý: thiết bị thông minh giúp cuộc sống thường ngày của bọn họ thuận luôn tiện và thuận tiện hơn. Có nhiều chiến thuật nhà thông minh trên thị trường được cho phép bạn tinh chỉnh các đồ vật thông minh bằng smartphone thông minh. Chỉ bằng một lần thừa nhận trên đồ vật di động, chúng ta có thể điều khiển nhiều thiết bị, chẳng hạn như TV thông minh, đèn, lắp thêm điều nhiệt và những thiết bị gia dụng khác.

Điều kiện tiên quyết

Kiến thức cơ phiên bản về lập trình sẵn Kotlin, bao hàm các biến, hàm cùng hàm println() và main()

Kiến thức bạn sẽ học được

Tổng quan liêu về OOPLớp là gì?Cách xác định lớp bởi hàm khởi tạo, hàm với thuộc tính.Cách tạo bạn dạng sao cho một đối tượng.Tính thừa kế là gì.Sự biệt lập giữa mối quan hệ IS-A với HAS-ACách ghi đè ở trong tính cùng hàm.Công vắt sửa đổi chính sách hiển thị là gì.Ủy quyền là gì cùng cách thực hiện ủy quyền by.

Sản phẩm bạn sẽ tạo ra

Cấu trúc lớp bên trong nhà thông minh.Lớp đại diện cho các thiết bị thông minh, ví dụ như TV thông minh với đèn thông minh.

Lưu ý: Mã chúng ta viết sẽ không tương tác với sản phẩm phần cứng thực. Nắm vào đó, bạn in các hành động trong bảng điều khiển bằng hàm println() để mô phỏng những tương tác.

Bạn cần có

Một chiếc máy vi tính có liên kết Internet và trình săn sóc web

2. Khẳng định một lớp

Khi khẳng định một lớp, bạn sẽ chỉ định những thuộc tính và cách tiến hành tất cả đối tượng người sử dụng của lớp đó yêu cầu có.

Định nghĩa lớp bước đầu bằng từ khóa class, theo sau là tên và tập hợp lốt ngoặc nhọn. Phần cú pháp trước lốt ngoặc nhọn cũng rất được gọi là tiêu đề lớp. Trong lốt ngoặc nhọn, bạn có thể chỉ định những 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 bên trong sơ đồ gia dụng này:

*

Dưới đó là những quy cầu đặt thương hiệu được lời khuyên cho một lớp:

Tên lớp được viết bằng PascalCase, do vậy, mỗi từ bắt đầu bằng một vần âm viết hoa và không tồn tại dấu giải pháp giữa các từ. Ví dụ: trong phần SmartDevice, chữ cái đầu tiên của từng từ được viết hoa và không tồn tại dấu phương pháp giữa những từ.

Một lớp bao gồm 3 phần chính:

Properties (Thuộc tính). những biến chỉ định và hướng dẫn thuộc tính của đối tượng người dùng của lớp.Phương thức. những hàm đựng hành vi và hành động của lớp.Hàm khởi tạo Một hàm thành viên đặc trưng tạo những thực thể của phần trong suốt xây dựng lớp này được xác định.

Đây không phải là lần thứ nhất bạn thao tác làm việc với các lớp. Trong các lớp học lập trình trước đây, chúng ta đã khám phá về các loại dữ liệu, chẳng hạn như loại dữ liệu Int, Float, String cùng Double. Những loại dữ liệu này được xác minh là phần trong Kotlin. Khi khẳng định một trở nên như trong đoạn mã này, bạn sẽ tạo một đối tượng của lớp Int. Lớp này được tạo thành thực thể bằng giá trị 1:

val number: Int = 1Xác định một lớp SmartDevice:

fun main() Trên loại trước hàm main(), hãy xác định lớp SmartDevice bao gồm nội dung gồm một nhận xét // empty body:class SmartDevice // empty bodyfun main()

3. Chế tạo ra một thực thể của lớp

Như bạn đã biết, lớp là phiên 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 dạng thiết kế để tạo thành một đối tượng cụ thể đó. Cùng với lớp SmartDevice, các bạn sẽ có phiên bản thiết kế của một đồ vật thông minh. Để gồm thiết bị hợp lý thực tế vào chương trình, bạn phải tạo một thực thể đối tượng người dùng SmartDevice. Cú pháp chế tác thực thể bước đầu bằng tên lớp, theo sau là 1 trong tập hợp lốt ngoặc đơn như hoàn toàn có thể thấy vào sơ vật dụng này:

*

Để sử dụng một đối tượng, bạn sẽ tạo đối tượng người sử dụng và hướng dẫn và chỉ định nó đó cho một biến, tựa như như phương pháp bạn xác định một biến. Chúng ta dùng keywords val nhằm tạo trở nên không thể đổi khác và keyword var mang đến biến hoàn toàn có thể thay đổi. Từ khóa val hoặc var theo sau là tên của biến, sau đó là một toán tử gán = rồi mang đến thực thể của đối tượng người dùng lớp. Bạn cũng có thể xem cú pháp vào sơ đồ gia dụng này:

*

Lưu ý: lúc bạn xác định biến bởi từ khóa val để tham chiếu đối tượng, trở thành đó chỉ rất có thể đọc, nhưng đối tượng người sử dụng lớp vẫn có thể thay đổi. Điều này tức là bạn chẳng thể chỉ định lại một đối tượng khác cho đổi mới đó, nhưng chúng ta cũng có thể thay đổi trạng thái của đối tượng người sử dụng khi cập nhật các cực hiếm thuộc tính của biến hóa đó.

Tạo thực thể lớp SmartDevice dưới dạng một đối tượng:

Trong hàm main(), hãy dùng từ khóa val để sinh sản một biến mang tên smartTvDevice với khởi tạo phát triển thành đó dưới dạng một phiên bản sao của lớp SmartDevice:

fun main() val smartTvDevice = SmartDevice()

4. Xác định các thủ tục của lớp

Trong bài xích 1, chúng ta đã được học về:

Định nghĩa về hàm sử dụng từ khóa fun theo sau là tập hợp vết ngoặc đối kháng và vết ngoặc nhọn. Lốt ngoặc nhọn cất mã, là hướng dẫn cần thiết để tiến hành một tác vụ.Cách gọi một hàm để thực thi tất cả mã có trong hàm đó.

Các thao tác lớp có thể thực hiện được xác minh là các hàm trong lớp. Ví dụ: hãy tưởng tượng chúng ta sở hữu một thiết bị thông minh, TV tối ưu hoặc đèn tối ưu và bạn có thể bật/tắt đèn kia bằng smartphone di động. Sản phẩm thông minh này được biên dịch quý phái lớp SmartDevice trong quy trình lập trình. Thao tác làm việc bật/tắt thứ này đã được biểu thị bằng hàm turnOn() và hàm turnOff(), chất nhận được kích hoạt hành vi tắt bật đó.

Cú pháp để xác minh một hàm vào lớp tương đồng với cú pháp chúng ta đã học tập trước đó. Điểm khác hoàn toàn duy độc nhất là hàm được đặt trong phần ngôn từ của lớp. Lúc bạn xác minh một hàm trong phần ngôn từ lớp, hàm này được gọi là hàm yếu tắc hoặc phương thức và thay mặt cho hành động của lớp. Trong phần sót lại của lớp học lập trình này, những hàm được gọi là cách làm bất cứ lúc nào chúng lộ diện trong phần văn bản của một lớp.

Xác định cách làm turnOn() với turnOff() trong lớp SmartDevice:

Trong phần nội dung của lớp SmartDevice, hãy xác định một cách thức turnOn() có phần ngôn từ trống:

class SmartDevice fun turnOn() Trong phần văn bản của phương thức turnOn(), hãy thêm 1 câu lệnh println() rồi truyền câu lệnh kia thành một chuỗi "Smart device is turned on.":class SmartDevice fun turnOn() println("Smart device is turned on.") Sau cách làm turnOn(), hãy thêm một thủ tục turnOff() nhằm in chuỗi "Smart device is turned off.":class SmartDevice fun turnOn() println("Smart device is turned on.") fun turnOff() println("Smart device is turned off.")

Gọi một thủ tục trên một đối tượng

Cho mang đến phần này, các bạn đã xác minh một lớp vào vai trò là bạn dạng thiết kế cho một thiết bị thông minh, chế tạo một thực thể của lớp và hướng đẫn thực thể đó cho một biến. Giờ đây, bạn có thể dùng cách tiến hành của lớp SmartDevice để bật và tắt thiết bị.

Lệnh gọi một cách làm trong một lớp tương tự như như cách bạn gọi những hàm khác từ hàm main() trong lớp học tập lập trình trước đó. Ví dụ: nếu đề xuất gọi phương thức turnOff() từ cách tiến hành turnOn(), chúng ta cũng có thể viết nội dung giống như như đoạn mã này:

class SmartDevice fun turnOn() // A valid use case to hotline the turnOff() method could be to turn off the TV when available nguồn doesn't meet the requirement. TurnOff() ... ...Để gọi một cách tiến hành lớp phía bên ngoài lớp, hãy ban đầu bằng đối tượng người dùng lớp theo sau là toán tử ., tên hàm cùng một tập hợp lốt ngoặc đơn. Nếu có thể, vệt ngoặc đơn có chứa các đối số cách tiến hành yêu cầu. Chúng ta cũng có thể xem cú pháp vào sơ đồ dùng này:

*

Gọi phương thức turnOn() và turnOff() trên đối tượng:

Trong hàm main() trên cái sau phát triển thành smartTvDevice, hãy gọi cách làm turnOn():

fun main() val smartTvDevice = SmartDevice() smartTvDevice.turnOn()Trên mẫu sau cách làm turnOn(), hãy gọi cách thức turnOff():fun main() val smartTvDevice = SmartDevice() smartTvDevice.turnOn() smartTvDevice.turnOff()Chạy mã.Kết quả đang như sau:

Smart device is turned on.Smart device is turned off.

5. Xác minh các trực thuộc tính của lớp

Trong bài 1, các bạn đã học về những biến, là các vùng chứa cho 1 phần dữ liệu. Các bạn đã tò mò cách tạo ra một biến đổi chỉ rất có thể đọc với từ bỏ khóa val và biến có thể đổi khác với từ bỏ khóa var.

Trong lúc phương thức xác định các thao tác làm việc một lớp rất có thể thực hiện, thì các thuộc tính này xác minh các đặc điểm hoặc thuộc tính dữ liệu của lớp. Ví dụ: một máy thông minh có những thuộc tính sau:

Tên tên thiết bị.Loại thiết bị. nhiều loại thiết bị thông minh, chẳng hạn như giải trí, ứng dụng hoặc nấu ăn.Trạng thái thiết bị. Cho dù thiết bị đang bật, tắt, trực tuyến đường hay nước ngoài tuyến. Trang bị được xem như là trực tuyến đường khi liên kết với Internet. Ví như không, nó đã được xem là ngoại tuyến.

Về cơ bản, ở trong tính là các biến được khẳng định trong phần câu chữ lớp thay vì phần ngôn từ hàm. Điều này có nghĩa là cú pháp để khẳng định thuộc tính với biến hệt nhau nhau. Bạn khẳng định một ở trong tính không thể thay đổi bằng keyword val cùng thuộc tính có thể chuyển đổi bằng keyword var.

Triển khai các đặc điểm nói xấp xỉ dạng trực thuộc tính của lớp SmartDevice:

Trên chiếc trước cách thức turnOn(), hãy khẳng định thuộc tính name cùng gán thuộc tính này cho 1 chuỗi "chuyenly.edu.vn TV":

class SmartDevice val name = "chuyenly.edu.vn TV" fun turnOn() println("Smart device is turned on.") fun turnOff() println("Smart device is turned off.") Trên chiếc sau nằm trong tính name, hãy khẳng định thuộc tính category và hướng đẫn thuộc tính đó mang lại chuỗi "Entertainment", tiếp nối xác định thuộc tính deviceStatus và chỉ định và hướng dẫn thuộc tính đó đến chuỗi "online":class SmartDevice val name = "chuyenly.edu.vn TV" val category = "Entertainment" var deviceStatus = "online" fun turnOn() println("Smart device is turned on.") fun turnOff() println("Smart device is turned off.") Trên cái sau thay đổi smartDevice, hãy điện thoại tư vấn hàm println() rồi truyền hàm này vào một trong những chuỗi "Device name is: $smartTvDevice.name":fun main() val smartTvDevice = SmartDevice() println("Device name is: $smartTvDevice.name") smartTvDevice.turnOn() smartTvDevice.turnOff()Chạy mã.Kết quả đã như sau:

Device name is: apk TVSmart device is turned on.Smart device is turned off.

Hàm getter và setter trong những thuộc tính

Thuộc tính rất có thể làm được nhiều việc rộng một biến. Ví dụ: đưa sử bạn tạo một cấu tạo lớp để thay mặt đại diện cho một TV thông minh. Một trong những hành động phổ thay đổi bạn thực hiện tại là tăng và giảm âm lượng. Để thể hiện hành động này vào lập trình, bạn có thể tạo một thuộc tính mang tên là speakerVolume. Thuộc tính này giữ mức âm lượng bây giờ được đặt trên loa TV, nhưng tất cả phạm vi cực hiếm cho âm thanh được đặt. Âm lượng buổi tối thiểu có thể đặt là 0 và tối đa là 100. Để bảo đảm an toàn thuộc tính speakerVolume không bao giờ vượt thừa 100 hoặc thấp hơn 0, chúng ta có thể viết một hàm setter. Khi update giá trị của ở trong tính, bạn cần kiểm tra xem giá trị đó gồm nằm trong tầm từ 0 cho 100 hay không. Một lấy ví dụ khác, hãy tưởng tượng bao gồm một yêu cầu để bảo vệ tên luôn phải viết hoa. Chúng ta cũng có thể triển khai hàm getter để đổi khác thuộc tính name 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 nắm rõ cú pháp để khai báo các thuộc tính này. Cú pháp không hề thiếu để xác minh thuộc tính có thể vậy đổi bước đầu bằng định nghĩa biến, theo sau là những hàm get() và set() (không bắt buộc). Bạn có thể xem cú pháp vào sơ đồ này:

*

Khi các bạn không khẳng định hàm getter cùng setter cho 1 thuộc tính, trình biên dịch Kotlin sẽ tạo nên các hàm trong nội bộ. Ví dụ: nếu khách hàng sử dụng từ khoá var để khẳng định một nằm trong tính speakerVolume và chỉ định cho một giá trị 2, trình biên dịch sẽ tự động hóa tạo những hàm getter cùng setter như chúng ta cũng có thể thấy trong đoạn mã này:

var speakerVolume = 2 get() = field set(value) field = value Bạn sẽ không còn thấy hồ hết dòng này trong mã vày trình biên dịch đã thêm nó vào nền.

Cú pháp không thiếu cho thuộc tính không thể cụ đổi tất cả hai điểm khác biệt:

Nó ban đầu với từ khóa val.Các biến của val là các loại chỉ được đọc, vày đó, chúng không có hàm set().

Thuộc tính Kotlin áp dụng trường sao lưu để giữ gìn giá trị trong bộ nhớ. Trường sao lưu về cơ bản là một biến hóa lớp được xác minh nội bộ bên phía trong các trực thuộc tính. Trường sao lưu phía trong phạm vi một nằm trong tính, tức là bạn chỉ rất có thể truy cập vào trường đó thông qua các hàm ở trong tính get() hoặc set().

Để đọc cực hiếm thuộc tính trong hàm get() hoặc cập nhật giá trị trong hàm set(), bạn cần sử dụng trường sao lưu của ở trong tính. Tệp này được trình biên dịch Kotlin tạo tự động hóa và được tham chiếu bởi giá trị nhấn dạng field.

Ví dụ: khi muốn update giá trị của trực thuộc tính vào hàm set(), bạn thực hiện tham số của hàm set() (còn được điện thoại tư vấn là tham số value) và gán quý giá đó mang lại field trở nên như bạn cũng có thể thấy trong khúc mã này:

var speakerVolume = 2 set(value) field = value Cảnh báo: ko được áp dụng tên thuộc tính để thừa nhận hoặc để giá trị. Ví dụ: vào hàm set(), nếu khách hàng có ý định chỉ định và hướng dẫn tham số value cho thiết yếu thuộc tính speakerVolume, thì mã đã nhập vào một vòng lặp vô hạn vì thời hạn chạy Kotlin rứa gắng update giá trị mang đến speakerVolume trực thuộc tính này, nó đã kích hoạt lệnh gọi đến hàm setter những lần.

Ví dụ: để bảo đảm giá trị được gán cho thuộc tính speakerVolume nằm trong vòng từ 0 mang đến 100, chúng ta cũng có thể triển khai hàm setter như bạn có thể thấy trong đoạn mã này:

var speakerVolume = 2 set(value) if (value in 0..100) field = value Hàm set() chất vấn xem quý hiếm Int gồm nằm vào phạm vi từ bỏ 0 đến 100 xuất xắc không bằng cách dùng từ khoá in theo sau là phạm vi giá chỉ trị. Nếu như giá trị phía bên trong phạm vi dự kiến, thì quý giá field sẽ được cập nhật. Giả dụ không, quý hiếm của thuộc tính sẽ không thay đổi.

Bạn sẽ thêm trực thuộc tính này vào một phần trong phần Triển khai quan hệ giữa các lớp của lớp học tập lập trình này, vì vậy, bây giờ bạn chưa rất cần phải thêm hàm setter vào mã.

6. Khẳng định hàm khởi sinh sản

Mục đích bao gồm của hàm khởi tạo là chỉ định phương pháp các đối tượng người sử dụng của lớp được tạo. Nói phương pháp khác, hàm khởi tạo sẽ tạo nên một đối tượng người dùng và khiến đối tượng người sử dụng đó chuẩn bị để sử dụng. Bạn làm việc này khi chế tạo thực thể mang đến đối tượng. Mã phía bên trong hàm khởi tạo xúc tiến khi đối tượng của lớp được tạo thực thể. Chúng ta cũng có thể xác định một hàm khởi tạo bao gồm hoặc không tồn tại tham số.

Hàm khởi chế tạo mặc định

Hàm khởi tạo nên mặc định là hàm khởi tạo không có tham số. Bạn cũng có thể xác định một hàm khởi chế tạo mặc định như trong đoạn mã này:

class SmartDevice constructor() ...Kotlin luôn đào bới sự súc tích, vì chưng vậy chúng ta có thể xoá keywords constructor nếu không tồn tại chú thích hoặc giải pháp sửa đổi chế độ hiển thị (bạn đã sớm được khám phá về nó) trên hàm khởi tạo. Bạn cũng có thể xoá vệt ngoặc đơn nếu hàm khởi tạo không tồn tại tham số như được hiển thị trong đoạn mã này:

class SmartDevice ...Trình biên dịch Kotlin sẽ tự động tạo hàm khởi tạo thành mặc định. Các bạn sẽ không thấy hàm khởi tạo thành mặc định được tạo tự động hóa trong mã vày hàm đó đã được trình biên dịch cung ứng trong nền.

Xác định một hàm khởi tạo có tham số

Trong lớp SmartDevice, những thuộc tính name với category là ko thể vắt đổi. Bạn cần đảm bảo an toàn tất cả các thực thể của lớp SmartDevice phần đa khởi tạo các thuộc tính name cùng category. Bằng cách triển khai hiện tại, các giá trị của ở trong tính name và category đã có được mã hóa cứng. Điều này tức là tất cả sản phẩm công nghệ thông minh được lấy tên bằng chuỗi "chuyenly.edu.vn TV" cùng được phân loại bởi chuỗi "Entertainment".

Xem thêm: Cách Dùng Thẻ Chiến Thuật Fo3 : 3, Kiếm Ep Fo3

Để bảo trì tính bất biến nhưng tránh những giá trị được mã hoá cứng, hãy cần sử dụng một hàm khởi tạo gồm tham số nhằm tạo những giá trị đó:

Trong lớp SmartDevice, hãy di chuyển các trực thuộc tính name và category quý phái hàm khởi tạo không phải chỉ định quý hiếm mặc định:

class SmartDevice(val name: String, val category: String) var deviceStatus = "online" fun turnOn() println("Smart device is turned on.") fun turnOff() println("Smart device is turned off.") Hàm khởi tạo hiện gật đầu đồng ý các tham số để tùy chỉnh cấu hình thuộc tính, vì vậy, bí quyết tạo thực thể của một đối tượng người dùng cho lớp đó cũng trở thành thay đổi. Chúng ta cũng có thể xem cú pháp đầy đủ để tạo thực thể cho một đối tượng người sử dụng trong sơ vật dụng này:

*

Lưu ý: nếu lớp không có hàm khởi chế tác mặc định và các bạn cố khởi tạo đối tượng không nên đối số, thì trình biên dịch sẽ báo cáo lỗi.

Dưới đây là nội dung biểu thị dòng mã:

SmartDevice("chuyenly.edu.vn TV", "Entertainment")Cả hai đối số mang lại hàm khởi tạo phần nhiều là chuỗi. Nó không rõ ràng về giá bán trị nên chỉ định mang đến tham số. Để khắc phục lỗi này, tựa như như cách bạn chuyển các đối số của hàm, chúng ta có thể tạo một hàm khởi tạo bao gồm đối số chọn cái tên như trong đoạn mã sau:

SmartDevice(name = "chuyenly.edu.vn TV", category = "Entertainment")Có hai các loại hàm khởi tạo chủ yếu trong Kotlin:

Hàm khởi tạo nên chính. một tờ chỉ hoàn toàn có thể có một hàm khởi sản xuất chính, được khẳng định là một phần của title lớp. Một hàm khởi chế tạo chính hoàn toàn có thể là một hàm khởi tạo mặc định hoặc tất cả tham số. Hàm khởi chế tạo chính không có nội dung. Điều đó tức là nó không được chứa ngẫu nhiên mã nào.Hàm khởi chế tạo phụ. Một lớp gồm thể có rất nhiều hàm khởi tạo ra phụ. Chúng ta cũng có thể xác định hàm khởi tạo ra phụ có hoặc không có tham số. Hàm khởi sản xuất phụ có thể khởi tạo ra lớp với có một trong những phần nội dung có thể chứa súc tích khởi tạo. Ví như lớp có một hàm khởi chế tác chính, từng hàm khởi chế tác phụ đều phải tạo lập hàm khởi tạo thành chính.

Bạn có thể dùng hàm khởi tạo thiết yếu để tạo những thuộc tính trong title lớp. Những đối số được chuyển đến hàm khởi tạo ra chỉ định cho các thuộc tính. Cú pháp để khẳng định một hàm khởi chế tạo ra chính bước đầu bằng tên lớp, theo sau là từ bỏ khóa constructor và một tập hợp lốt ngoặc đơn. Lốt ngoặc solo chứa những tham số cho hàm khởi tạo thành chính. Nếu có nhiều hơn một tham số, dấu phẩy đang phân tách các có mang tham số. Bạn cũng có thể xem cú pháp rất đầy đủ để xác minh một hàm khởi tạo thiết yếu trong sơ thứ này:

*

Hàm khởi tạo ra phụ nằm trong phần nội dung của lớp với cú pháp của hàm này bao gồm 3 phần:

Khai báo hàm khởi sản xuất phụ. Việc xác minh hàm khởi sinh sản phụ bắt đầu bằng keyword constructor theo sau là vệt ngoặc đơn. Nếu mê say hợp, vết ngoặc 1-1 chứa những tham số hàm khởi chế tạo ra phụ yêu thương cầu.Khởi tạo nên hàm khởi chế tạo ra chính. Khởi tạo bằng dấu nhì chấm, theo sau là keyword this cùng một tập hợp lốt ngoặc đơn. Nếu thích hợp hợp, lốt ngoặc đối kháng sẽ chứa những tham số hàm khởi tạo chủ yếu yêu cầu.Nội dung hàm khởi tạo nên phụ. Khởi chạy hàm khởi sinh sản chính, theo sau là 1 trong những tập hợp vệt ngoặc nhọn, cất phần văn bản của hàm khởi chế tạo phụ.

Bạn có thể xem cú pháp trong sơ đồ dùng này:

*

Ví dụ: giả sử bạn muốn tích đúng theo API vì chưng một nhà cung ứng thiết bị xuất sắc phát triển. Mặc dù nhiên, API vẫn trả về mã tinh thần của loại Int để cho biết thêm trạng thái thứ ban đầu. API trả về một quý hiếm 0 nếu đồ vật ngoại tuyến và một giá trị 1 nếu thiết bị đó trực tuyến. Đối với bất kỳ giá trị số nguyên làm sao khác, tâm lý được xem như là không xác định. Chúng ta cũng có thể tạo một hàm khởi tạo ra phụ vào lớp SmartDevice để chuyển đổi tham số statusCode này thành đại diện chuỗi như có thể thấy trong đoạn mã sau:

class SmartDevice(val name: String, val category: String) var deviceStatus = "online" constructor(name: String, category: String, statusCode: Int) : this(name, category) deviceStatus = when (statusCode) 0 -> "offline" 1 -> "online" else -> "unknown" ...

7. Triển khai mối quan hệ tình dục giữa những lớp

Tính kế thừa chất nhận được bạn sản xuất một lớp dựa trên điểm lưu ý và hành vi của một lớp khác. Đây là 1 trong những cơ chế mạnh khiến cho bạn viết mã hoàn toàn có thể sử dụng lại và tùy chỉnh thiết lập mối quan hệ giới tính giữa các lớp.

Ví dụ: có nhiều thiết bị hợp lý trên thị trường, chẳng hạn như TV thông minh, đèn tối ưu và công tắc nguồn thông minh. Lúc bạn biểu thị các trang bị thông minh trong lập trình, chúng sẽ cần sử dụng chung một số thuộc tính như tên, hạng mục và trạng thái. Chúng cũng có thể có các hành động phổ biến, chẳng hạn như khả năng bật và tắt những tùy lựa chọn đó.

Tuy nhiên, cách bật hoặc tắt từng lắp thêm thông minh đang khác nhau. Ví dụ: để bật TV, bạn có thể phải bật màn hình, sau đó tùy chỉnh mức âm thanh và kênh đã mở lần ngay sát nhất. Khía cạnh khác, để nhảy đèn, bạn cũng có thể chỉ bắt buộc tăng hoặc giảm độ sáng.

Ngoài ra, mỗi lắp thêm thông minh bao gồm nhiều tính năng và làm việc thực hiện tại hơn. Ví dụ: so với TV, chúng ta cũng có thể điều chỉnh âm thanh và đổi khác kênh. Cùng với đèn, chúng ta có thể điều chỉnh khả năng chiếu sáng hoặc color sắc.

Tóm lại, toàn bộ các lắp thêm thông minh đều phải có các hào kiệt khác nhau, nhưng tất cả chung một số đặc điểm. Bạn cũng có thể sao chép các điểm sáng chung này cho tới từng lớp thứ thông minh hoặc làm cho mã hoàn toàn có thể tái áp dụng với tính kế thừa.

Để thao tác làm việc này, bạn phải tạo một lớp mẹ SmartDevice và xác minh các nằm trong tính cũng như hành vi phổ cập này. Sau đó, chúng ta cũng có thể tạo những lớp con, ví dụ như lớp SmartTvDevice và SmartLightDevice. Các lớp này kế thừa các thuộc tính của lớp mẹ.

Trong những ngôn ngữ lập trình, họ nói lớp SmartTvDevice với SmartLightDevice mở rộng lớp bà bầu SmartDevice. Lớp mẹ có cách gọi khác là lớp cao cấp với lớp nhỏ là lớp phụ. Chúng ta cũng có thể thấy quan hệ giữa bọn chúng trong sơ trang bị này:

*

Tuy nhiên, vào Kotlin, toàn bộ các lớp số đông là cuối cùng, nghĩa là chúng ta không thể mở rộng các lớp đó, vì vậy, các bạn phải xác định mối quan hệ tình dục giữa các lớp đó.

Xác định quan hệ giữa lớp thời thượng SmartDevice và những lớp con:

Trong lớp cao cấp SmartDevice, hãy thêm một từ khóa mở cửa trước từ bỏ khóa class:

open class SmartDevice(val name: String, val category: String) ...Từ khóa open thông báo cho trình biên dịch lớp này hoàn toàn có thể mở rộng, bởi vì vậy, các lớp khác hiện có thể mở rộng.

Cú pháp để tạo ra lớp con bắt đầu bằng câu hỏi tạo title lớp như các bạn đã có tác dụng từ trước mang đến nay. Vết ngoặc solo đóng của hàm khởi tạo được theo sau là dấu cách, lốt hai chấm, dấu giải pháp khác, tên lớp cao cấp và tập hợp dấu ngoặc đơn. Nếu như cần, dấu ngoặc đơn sẽ bao hàm các thông số được yêu cầu vày hàm khởi tạo lớp cao cấp. Chúng ta có thể xem cú pháp trong sơ thứ này:

*

Tạo lớp bé SmartTvDevice mở rộng lớp thời thượng SmartDevice:

class SmartTvDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) Việc xác định constructor mang đến SmartTvDevice không chỉ có định xem những thuộc tính này còn có thể thay đổi hay ko thể nạm đổi. Điều này tức là tham số deviceName cùng deviceCategory chỉ là tham số constructor hơn là thuộc tính lớp. Bạn sẽ không thể cần sử dụng chúng vào lớp này, chỉ việc chuyển các lớp đó mang đến hàm khởi chế tạo lớp cao cấp.

Trong phần nội dung của lớp bé SmartTvDevice, hãy thêm thuộc tính speakerVolume bạn đã chế tác khi được học tập về các hàm getter và setter:

class SmartTvDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) var speakerVolume = 2 set(value) if (value in 0..100) field = value Xác định một trực thuộc tính channelNumber được hướng dẫn và chỉ định cho giá trị 1 bằng một hàm setter chỉ định một phạm vi 0..200:class SmartTvDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) var speakerVolume = 2 set(value) if (value in 0..100) field = value var channelNumber = 1 set(value) if (value in 0..200) field = value Xác định thủ tục increaseSpeakerVolume() tăng âm lượng và in chuỗi "Speaker volume increased to lớn $speakerVolume.":class SmartTvDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) var speakerVolume = 2 set(value) if (value in 0..100) field = value var channelNumber = 1 set(value) if (value in 0..200) field = value fun increaseSpeakerVolume() speakerVolume++ println("Speaker volume increased to lớn $speakerVolume.") Thêm cách tiến hành nextChannel() để tăng con số kênh cùng in chuỗi "Channel number increased khổng lồ $channelNumber.":class SmartTvDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) var speakerVolume = 2 set(value) if (value in 0..100) field = value var channelNumber = 1 set(value) if (value in 0..200) field = value fun increaseSpeakerVolume() speakerVolume++ println("Speaker volume increased to $speakerVolume.") fun nextChannel() channelNumber++ println("Channel number increased khổng lồ $channelNumber.") Trên dòng sau lớp con SmartTvDevice, hãy xác minh lớp bé SmartLightDevice không ngừng mở rộng lớp thời thượng SmartDevice:class SmartLightDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) Trong phần câu chữ lớp con SmartLightDevice, hãy xác minh một trực thuộc tính brightnessLevel được gán cho giá trị 0 bằng một hàm setter chỉ định và hướng dẫn một phạm vi 0..100:class SmartLightDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) var brightnessLevel = 0 set(value) if (value in 0..100) field = value Xác định cách làm increaseBrightness() tăng mức độ sáng của đèn và in chuỗi "Brightness increased to lớn $brightnessLevel.":class SmartLightDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) var brightnessLevel = 0 set(value) if (value in 0..100) field = value fun increaseBrightness() brightnessLevel++ println("Brightness increased to $brightnessLevel.")

Mối quan hệ giữa những lớp

Khi sử dụng tính kế thừa, bạn cấu hình thiết lập mối dục tình giữa hai lớp bên trong mối quan hệ giới tính IS-A. Đối tượng cũng là 1 trong thực thể của lớp, tự đó đối tượng người sử dụng này kế thừa. Vào mối dục tình HAS-A, một đối tượng hoàn toàn có thể sở hữu một thực thể của lớp khác mà lại không thực thụ là thực thể của lớp đó. Bạn có thể thấy phần bộc lộ cấp cao về những mối quan hệ tình dục trong sơ vật dụng này:

*

Mối quan tiền hệ IS-A

Khi các bạn chỉ định mối quan hệ IS-A thân lớp thời thượng SmartDevice với lớp nhỏ SmartTvDevice, nó tức là bất kể đa số gì lớp thời thượng SmartDevice có thể làm, lớp con SmartTvDevice hoàn toàn có thể làm được. Mối quan hệ này là 1 trong chiều, do vậy chúng ta cũng có thể nói từng TV xuất sắc là một thiết bị thông minh nhưng quan yếu nói đầy đủ thiết bị lý tưởng TV thông minh. Mã biểu hiện cho mối quan hệ IS-A được hiển thị trong đoạn mã sau:

// Smart TV IS-A smart device.class SmartTvDevice : SmartDevice() Không sử dụng tính thừa kế chỉ để dành được tính tái áp dụng mã. Trước khi chúng ta quyết định, hãy soát sổ xem nhị lớp có liên quan với nhau xuất xắc không. Trường hợp chúng có thể hiện một vài mối quan hệ, hãy bình chọn xem chúng có thực sự đủ đk để thiết lập cấu hình mối dục tình IS-A hay không. Hãy trường đoản cú hỏi: "Lớp con liệu có phải là lớp thời thượng không?". Ví dụ: chuyenly.edu.vn một hệ điều hành.

Mối quan lại hệ HAS-A

Mối quan hệ nam nữ HAS-A là một trong cách khác để chỉ định mối quan hệ giữa nhì lớp. Ví dụ: bạn có thể đang thực hiện TV thông minh tận nhà của mình. Trong trường hòa hợp này, có quan hệ giữa TV thông minh cùng nhà bạn. Nhà này còn có chứa một thứ thông minh, hoặc nói theo một cách khác là bên có mộtthiết bị thông minh. Quan hệ HAS-A thân hai lớp cũng rất được gọi là sự kết hợp.

Cho đến nay, bạn đã tạo ra một vài lắp thêm thông minh. Bây giờ, các bạn sẽ tạo lớp SmartHome, chứa các thiết bị thông minh. Lớp SmartHome cho phép bạn cửa hàng với các thiết bị thông minh.

Sử dụng mối quan hệ HAS-A để xác minh lớp SmartHome:

Ở thân lớp SmartLightDevice và hàm main(), hãy xác minh một lớp SmartHome:

class SmartLightDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) ...class SmartHome fun main() ...Trong hàm khởi tạo lớp SmartHome, hãy dùng từ khóa val để tạo nên thuộc tính smartTvDevice thuộc một số loại SmartTvDevice:// The SmartHome class HAS-A smart TV device.class SmartHome(val smartTvDevice: SmartTvDevice) Trong phần câu chữ của lớp SmartHome, hãy xác định một cách tiến hành turnOnTv() để gọi phương thức turnOn() trên ở trong tính smartTvDevice:class SmartHome(val smartTvDevice: SmartTvDevice) fun turnOnTv() smartTvDevice.turnOn() Trên mẫu sau cách làm turnOnTv(), hãy xác minh phương thức turnOffTv() nhằm gọi cách làm turnOff() trên trực thuộc tính smartTvDevice:class SmartHome(val smartTvDevice: SmartTvDevice) fun turnOnTv() smartTvDevice.turnOn() fun turnOffTv() smartTvDevice.turnOff() Trên loại sau thủ tục turnOffTv(), hãy khẳng định phương thức increaseTvVolume() nhằm gọi cách tiến hành increaseSpeakerVolume() trên thuộc tính smartTvDevice, kế tiếp xác định phương thức changeTvChannelToNext() nhằm gọi cách tiến hành nextChannel() trên trực thuộc tính smartTvDevice:class SmartHome(val smartTvDevice: SmartTvDevice) fun turnOnTv() smartTvDevice.turnOn() fun turnOffTv() smartTvDevice.turnOff() fun increaseTvVolume() smartTvDevice.increaseSpeakerVolume() fun changeTvChannelToNext() smartTvDevice.nextChannel() Trong hàm khởi chế tác lớp SmartHome, dịch rời tham số ở trong tính smartTvDevice sang cái riêng, theo sau là dấu phẩy:class SmartHome( val smartTvDevice: SmartTvDevice,) ...Trên cái sau nằm trong tính smartTvDevice, cần sử dụng từ khóa val để khẳng định thuộc tính smartLightDevice thuộc loại SmartLightDevice:// Smart trang chủ HAS-A smart TV device và smart light.class SmartHome( val smartTvDevice: SmartTvDevice, val smartLightDevice: SmartLightDevice) ...Trong SmartHome nội dung, xác minh phương thứcturnOnLight() để gọi cách làm turnOn() trên đối tượng người tiêu dùng smartLightDevice với một đối tượngturnOffLight() để gọi cách làm turnOff() trên đối tượng smartLightDevice:class SmartHome( val smartTvDevice: SmartTvDevice, val smartLightDevice: SmartLightDevice) ... Fun changeTvChannelToNext() smartTvDevice.nextChannel() fun turnOnLight() smartLightDevice.turnOn() fun turnOffLight() smartLightDevice.turnOff() Trên cái sau cách tiến hành turnOffLight(), hãy khẳng định phương thức increaseLightBrightness() nhằm gọi cách tiến hành increaseBrightness() trên trực thuộc tính smartLightDevice:class SmartHome( val smartTvDevice: SmartTvDevice, val smartLightDevice: SmartLightDevice) ... Fun changeTvChannelToNext() smartTvDevice.nextChannel() fun turnOnLight() smartLightDevice.turnOn() fun turnOffLight() smartLightDevice.turnOff() fun increaseLightBrightness() smartLightDevice.increaseBrightness() Trên dòng sau cách làm increaseLightBrightness(), hãy xác minh phương thức turnOffAllDevices() để gọi cách làm turnOffTv() và turnOffLight():.class SmartHome( val smartTvDevice: SmartTvDevice, val smartLightDevice: SmartLightDevice) ... Fun turnOffAllDevices() turnOffTv() turnOffLight()

Ghi đè cách làm của lớp thời thượng từ các lớp con

Như đã đàm luận trước đó, mặc dù chức năng tắt bật được toàn bộ các sản phẩm thông minh hỗ trợ, nhưng cách thực hiện công dụng này không giống nhau. Để hỗ trợ hành vi chỉ định và hướng dẫn cho thứ này, bạn cần ghi đè thủ tục turnOn() với turnOff() được xác minh trong lớp cao cấp. Để ghi đè nghĩa là chặn hành động, thường xuyên là để kiểm soát thủ công. Khi chúng ta ghi đè một phương thức, cách thức trong lớp con sẽ làm đứt quãng quá trình triển khai phương thức được xác minh trong lớp thời thượng và cung cấp phương thức tiến hành của thiết yếu nó.

Ghi đè lớp SmartDevice cách thức turnOn() cùng turnOff():

Trong phần câu chữ của lớp cao cấp SmartDevice trước từ khoá fun của mỗi phương thức, hãy thêm keywords open:

open class SmartDevice ... Var deviceStatus = "online" open fun turnOn() // function toàn thân open fun turnOff() // function body toàn thân Trong lớp con SmartLightDevice trước tự khóa fun của cách tiến hành turnOn() với turnOff(), hãy thêm tự khóa override:class SmartLightDevice(name: String, category: String) : SmartDevice(name = name, category = category) var brightnessLevel = 0 override fun turnOn() deviceStatus = "on" brightnessLevel = 2 println("$name turned on. The brightness màn chơi is $brightnessLevel.") override fun turnOff() deviceStatus = "off" brightnessLevel = 0 println("Smart Light turned off") fun increaseBrightness() brightnessLevel++ Từ khóa override thông báo thời hạn chạy Kotlin để tiến hành mã gồm trong cách tiến hành đã xác minh trong lớp con.

Trong lớp SmartTvDevice trước trường đoản cú khóa fun của cách thức turnOn() với turnOff(), hãy thêm từ khóa override:

class SmartTvDevice(name: String, category: String) : SmartDevice(name = name, category = category) var speakerVolume = 2 set(value) if (value in 0..100) field = value var channelNumber = 1 set(value) if (value in 0..200) field = value override fun turnOn() deviceStatus = "on" println( "$name is turned on. Speaker volume is set khổng lồ $speakerVolume và channel number is " + "set to lớn $channelNumber." ) override fun turnOff() deviceStatus = "off" println("$name turned off") fun increaseSpeakerVolume() speakerVolume++ println("Speaker volume increased lớn $speakerVolume.") fun nextChannel() channelNumber++ println("Channel number increased lớn $channelNumber.") Trong hàm main(), hãy sử dụng từ khóa var để xác định biến SmartDevice của các loại SmartTvDevice sẽ tạo thực thể cho đối tượng người sử dụng SmartTvDevice để lấy đối số "chuyenly.edu.vn TV" và đối số "Entertainment":fun main() var smartDevice: SmartDevice = SmartTvDevice("chuyenly.edu.vn TV", "Entertainment")Trên chiếc sau biến hóa smartDevice, gọi phương thức turnOn() trên đối tượng người dùng smartDevice:fun main() var smartDevice : SmartDevice = SmartTvDevice("chuyenly.edu.vn TV", "Entertainment") smartDevice.turnOn()Chạy mã.Kết quả sẽ như sau:

chuyenly.edu.vn TV is turned on. Speaker volume is set khổng lồ 2 và channel number is set khổng lồ 1.Trên dòng sau khi gọi thủ tục turnOn(), chỉ định lại biến hóa smartDevice để sản xuất thực thể cho một lớp SmartLightDevice thừa nhận đối số "Google Light" và một đối số "Utility", và sau đó gọi cách làm turnOn() trên tham chiếu đối tượng smartDevice:fun main() var smartDevice: SmartDevice = SmartTvDevice("chuyenly.edu.vn TV", "Entertainment") smartDevice.turnOn() smartDevice = SmartLightDevice("Google Light", "Utility") smartDevice.turnOn()Chạy mã.Kết quả sẽ như sau:

chuyenly.edu.vn TV is turned on. Speaker volume is set khổng lồ 2 and channel number is set to lớn 1.Google Light is turned on. The brightness cấp độ is set to lớn 2.Đây là 1 trong những ví dụ về tính chất đa hình. Mã này gọi phương thức turnOn() trên đổi thay thuộc các loại SmartDevice và tuỳ trực thuộc vào giá chỉ trị thực tiễn của đổi mới đó, chúng ta cũng có thể thực thi các quy trình triển khai không giống nhau của cách làm turnOn().

Sử dụng lại mã lớp thời thượng trong những lớp nhỏ bằngsuper từ khóa

Khi chăm chú kỹ cách làm turnOn() và turnOff(), bạn nhận biết biến deviceStatus tất cả điểm giống như nhau trong biện pháp nó được cập nhật, bất cứ khi nào phương thức được gọi trong lớp bé SmartTvDevice cùng SmartLightDevice: 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 vào lớp SmartDevice.

Để gọi thủ tục bị ghi đè từ bỏ lớp cao cấp, bạn phải sử dụng từ khóa super. Vấn đề gọi một thủ tục từ lớp thời thượng cũng giống như như gọi cách tiến hành từ bên phía ngoài lớp. Thay bởi vì dùng toán tử . Giữa đối tượng và phương thức, bạn phải dùng keywords super để thông tin cho trình biên dịch Kotlin gọi cách thức trên lớp thời thượng thay vị lớp con.

Cú pháp để gọi phương thức từ lớp cao cấp bước đầu bằng keyword super, theo sau là toán tử ., tên hàm với một tập hợp vết ngoặc đơn. Nếu bao gồm thể, vết ngoặc đơn có bao gồm các đối số. Bạn cũng có thể xem cú pháp vào sơ đồ dùng này:

*

Sử dụng lại mã vào lớp thời thượng SmartDevice:

Di chuyển mã hoàn toàn có thể tái thực hiện từ những lớp con SmartTvDevice với SmartLightDevice thanh lịch lớp cao cấp SmartDevice:

open class SmartDevice(val name: String, val category: String) var deviceStatus = "online" mở cửa fun turnOn() deviceStatus = "on" xuất hiện fun turnOff() deviceStatus = "off" Dùng tự khóa super để gọi các phương thức từ bỏ lớp SmartDevice trong các lớp con SmartTvDevice và SmartLightDevice:class SmartTvDevice(name: String, category: String) : SmartDevice(name = name, category = category) var speakerVolume = 2 set(value) if (value in 0..100) field = value var channelNumber = 1 set(value) if (value in 0..200) field = value override fun turnOn() super.turnOn() println("Smart TV turned on. Speaker volume set khổng lồ $speakerVolume.") override fun turnOff() super.turnOff() println("Smart TV turned off") fun increaseSpeakerVolume() speakerVolume++ println("Speaker volume increased to lớn $speakerVolume.") fun nextChannel() channelNumber++ fun previousChannel() channelNumber-- class SmartLightDevice(name: String, category: String) : SmartDevice(name = name, category = category) var brightnessLevel = 0 override fun turnOn() super.turnOn() brightnessLevel = 2 println("Smart Light turned on. The brightness level is $brightnessLevel.") override fun turnOff() super.turnOff() brightnessLevel = 0 println("Smart Light turned off") fun increaseBrightness() brightnessLevel++

Ghi đè các thuộc tính lớp cao cấp từ các lớp con

Tương tự như các phương thức, bạn có thể ghi đè những thuộc tính bằng các bước tương tự.

Ghi đè thuộc tính deviceStatus:

Trong lớp cao cấp SmartDevice trên cái sau nằm trong tính deviceStatus, hãy sử dụng từ khoá open và val để khẳng định thuộc tính deviceType được đặt thành chuỗi "unknown":

open class SmartDevice(val name: String, val category: String) var deviceStatus = "online" mở cửa val deviceType = "unknown" ...Trong lớp SmartTvDevice, hãy cần sử dụng từ khóa override và val để xác định thuộc tính deviceType được đặt thành chuỗi "Smart TV":class SmartTvDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) ... Override val deviceType = "Smart TV" ...Trong lớp SmartLightDevice, hãy sử dụng từ khoá override và val để xác minh thuộc tính deviceType được để thành giá trị "Smart Light":class SmartLightDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) ... Override val deviceType = "Smart Light" ...

8. Chỉ định truy cập

thông số sửa đổi cơ chế hiển thị vào vai trò đặc biệt để hoàn thiện đóng gói:

Trong lớp, nó được cho phép bạn ẩn các thuộc tính và phương thức khỏi quyền truy vấn trái phép từ bên ngoài lớp.Trong gói, nó có thể chấp nhận được bạn ẩn những lớp và hình ảnh khỏi quyền truy vấn trái phép từ bên phía ngoài gói.

Kotlin hỗ trợ 4 hệ số sửa đổi cơ chế hiển thị:

public. thông số sửa đổi cơ chế hiển thị mang định. được cho phép khai báo hoàn toàn có thể truy cập ở phần nhiều nơi. Các thuộc tính cùng phương thức bạn muốn dùng phía bên ngoài lớp đã được khắc ghi công khai.private. có thể chấp nhận được khai báo rất có thể truy cập trong cùng một lớp hoặc tệp nguồn.

Có một vài thuộc tính và phương thức chỉ được dùng bên phía trong lớp kia và chúng ta không độc nhất thiết muốn những lớp không giống sử dụng. Chúng ta có thể đánh dấu các thuộc tính và cách thức này bằng thông số sửa đổi cơ chế hiển thị private để bảo vệ một lớp khác quan yếu vô tình truy cập vào.

protected. cho phép khai báo hoàn toàn có thể truy cập trong những lớp con. Các thuộc tính và phương thức bạn có nhu cầu dùng trong lớp khẳng định các lớp đó với lớp bé được đánh dấu bằng những chỉ định truy vấn protected.internal. có thể chấp nhận được khai báo có thể truy cập được trong cùng một mô-đun. Dụng cụ sửa đổi nội bộ tương tự với riêng biệt, nhưng chúng ta có thể truy cập vào những thuộc tính và cách làm nội cỗ từ phía bên ngoài lớp, miễn là quy định này được truy cập trong cùng một mô-đun.

Lưu ý: mô-đun là 1 trong tập hợp các tệp nguồn và cơ chế cài đặt bản dựng có thể chấp nhận được bạn phân chia dự án của bản thân mình thành những đơn vị tác dụng riêng biệt. Dự án công trình của chúng ta cũng có thể có một hoặc các mô-đun. Bạn cũng có thể độc lập xây dựng, chất vấn và gỡ lỗi từng mô-đun.

Gói về cơ phiên bản là một thư mục nhóm những lớp tất cả liên quan, trong lúc một mô-đun hỗ trợ vùng chứa cho mã nguồn, tệp khoáng sản và các chế độ setup cấp ứng dụng của ứng dụng. Một mô-đun có thể đựng nhiều gói.

Khi bạn xác minh một lớp, nó này sẽ hiển thị công khai và ngẫu nhiên gói như thế nào nhập nó đều rất có thể truy cập, có nghĩa là lớp đó ở chính sách công khai theo khoác định, trừ khi chúng ta chỉ định từ bỏ khóa xác minh mức độ hiển thị. Tương tự, lúc bạn xác định hoặc khai báo những thuộc tính và cách làm trong lớp, theo khoác định, chúng rất có thể được truy tìm cập phía bên ngoài lớp thông qua đối tượng người dùng lớp. Điều quan trọng là bắt buộc xác định chính sách hiển thị thích hợp cho mã, đa phần để ẩn những 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 coi cách người lái xe rất có thể sử dụng ô tô. Theo mang định, những đưa ra tiết thành phần tạo đề xuất một loại xe xe hơi và cách xe hoạt động được ẩn giấu mặt trong. Chiếc xe ô tô có phong cách thiết kế để quản lý và vận hành trực quan tiền nhất gồm thể. Bạn không muốn xe hơi vận động phức tạp như một máy cất cánh thương mại, tương tự như như bài toán bạn không thích một nhà cách tân và phát triển khác hoặc bản thân bạn về sau 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.

Chỉ định truy hỏi cập 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à bảo đảm an toàn loại trừ việc tiến hành một bí quyết 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 chỉ định truy cập trước cú pháp khai báo, bên cạnh đó khai báo lớp, phương thức hoặc nằm trong tính như có thể thấy trong sơ đồ này:

*

Xác định chỉ định truy cập cho các thuộc tính

Cú pháp để xác định chỉ định truy cập cho một thuộc tính ban đầu bằng chỉ định truy cập private, protected hoặc internal, theo sau là cú pháp khẳng định thuộc tính. Bạn cũng có thể xem cú pháp vào sơ trang bị này:

*

Ví dụ: bạn có thể xem cách đặt ở trong tính deviceStatus ở chính sách riêng tứ trong đoạn mã này:

open class SmartDevice(val name: String, val category: String) ... Private var deviceStatus = "online" ...Bạn cũng rất có thể đặt hệ số sửa đổi cơ chế hiển thị thành những hàm setter. Hệ số sửa đổi được để trước trường đoản cú khóa set. Chúng ta có thể xem cú pháp vào sơ thứ này:

*

Lưu ý: Nếu hệ số sửa đổi chế độ hiển thị mang lại hàm getter không hợp với thông số sửa đổi cơ chế hiển thị mang lại thuộc tính, thì trình biên dịch đã báo lỗi.

Đối với lớp SmartDevice, quý giá của nằm trong tính deviceStatus nên đọc được phía bên ngoài lớp thông qua các đối tượng lớp. Mặc dù nhiên, chỉ gồm lớp và các lớp nhỏ mới gồm thể update hoặc ghi giá trị. Để triển khai yêu mong này, bạn cần phải sử dụng thông số sửa thay đổi protected trên hàm set() của trực thuộc tính deviceStatus.

Dùng hệ số sửa thay đổi protected trên hàm set() của thuộc tính deviceStatus:

Trong nằm trong tính deviceStatus của lớp cao cấp SmartDevice, thêm hệ số sửa thay đổi protected vào hàm set():

open class SmartDevice(val name: String, val category: String) ... Var deviceStatus = "online" protected set(value) field = value ...Bạn hiện nay không thực hiện bất kỳ hành cồn hoặc bước kiểm soát nào vào hàm set(). Bạn chỉ cần chỉ định tham số value cho biến field. Như các bạn đã được học, điều này tựa như như cách triển khai mặc định cho cách thức setter nằm trong tính. Trong trường thích hợp này, bạn có thể bỏ qua lốt ngoặc đối kháng và ngôn từ của hàm set():

open class SmartDevice(val name: String, val category: String) ... Var deviceStatus = "online" protected phối ...Trong lớp con SmartHome, hãy xác định một ở trong tính deviceTurnOnCount được đặt thành quý hiếm 0 bởi một hàm setter riêng rẽ tư:class SmartHome( val smartTvDevice: SmartTvDevice, val smartLightDevice: SmartLightDevice) var deviceTurnOnCount = 0 private mix ...Thêm ở trong tính deviceTurnOnCount theo sau là toán tử số học tập ++ vào thủ tục turnOnTv() với turnOnLight(). Sau đó, thêm nằm trong tính deviceTurnOnCount theo sau là toán tử số học tập -- vào thủ tục turnOffTv() với turnOffLight():class SmartHome( val smartTvDevice: SmartTvDevice, val smartLightDevice: SmartLightDevice) var deviceTurnOnCount = 0 private set fun turnOnTv() deviceTurnOnCount++ smartTvDevice.turnOn() fun turnOffTv() deviceTurnOnCount-- smartTvDevice.turnOff() ... Fun turnOnLight() deviceTurnOnCount++ smartLightDevice.turnOn() fun turnOffLight() deviceTurnOnCount-- smartLightDevice.turnOff() ...

Chỉ định truy cập cho các phương thức

Cú pháp để hướng dẫn và chỉ định một thông số sửa thay đổi mức độ hiển thị cho một phương thức bước đầu bằng hệ số sửa đổi private, protected hoặc internal, theo sau là cú pháp khẳng định một phương thức. Bạn cũng có thể xem cú pháp vào sơ đồ gia dụng này:

*

Ví dụ: chúng ta cũng có thể xem biện pháp chỉ định thông số sửa thay đổi protected cho cách thức nextChannel() trong lớp SmartTvDevice trong đoạn mã này:

class SmartTvDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) ... Protected fun nextChannel() channelNumber++ ...

Chỉ định truy vấn cho các hàm khởi tạo

Cú pháp nhằm chỉ định thông số sửa đổi mức độ hiển thị mang đến hàm khởi t