Trong bài trước mình đã trình bày về lập trình hướng đối tượng cơ bản thông qua việc sử dụng class. Nhưng nói tới lập trình hướng đối tượng mà không đề cập tới tính kế thừa và chuyển đổi kiểu thì sẽ là một thiếu sót lớn. Bài viết này mình sẽ tập trung vào chủ đề này để hoàn thành mảnh ghép còn thiếu nhé.


Tính kế thừa


Trước tiên, mình cũng nhắc lại một chút về khái niệm tính kế thừa đã nhé.

Tính kế thừa là gì?

Tính kế thừa trong Swift tương tự như các ngôn ngữ khác ở những đặc điểm như sau:

  • Cho phép một đối tượng kế thừa lại các đặc tính có sẵn của một đối tượng khác.
  • Cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Tính kế thừa thể hiện khả năng tái sử dụng các lớp đã được định nghĩa. Khi một lớp kế thừa từ một lớp khác, lớp kế thừa được gọi là một lớp con (subclass), và lớp được nó kế thừa gọi là lớp cha (superclass).

Cú pháp

Bạn sử dụng dấu “:” để chỉ định thực hiện việc kế thừa từ một lớp nào đó, cú pháp:
class trong Swift

Ví dụ: Bạn hãy tạo lớp Shapes như sau.
class trong SwiftClass Shapes ở trên chỉ là class thông thường thôi bạn nhé, chưa có kế thừa gì cả đâu. Bạn còn nhớ class Rectanglebài viết trước không? Rectangle là một loại hình học, vì vậy Rectangle được kế thừa từ lớp Shapes như ví dụ sau:
class trong Swift

Khởi tạo lớp con

Sau khi thực hiện kế thừa, lớp con nhận kế thừa sẽ có đầy đủ các đặc tính (thuộc tính, phương thức) của lớp cha. Tuy nhiên bạn cần lưu ý một số từ khoá sau để tham chiếu tới các thành phần trong class:

  • Từ khóa super để tham chiếu tới các thành phần của lớp cha.
  • Từ khóa self tác dụng tương đương như this trong C++ (chính bản thân đang thể hiện của lớp – object hiện tại).

Bên cạnh đó lớp con vẫn còn có những thuộc tính của riêng nó. Vì thế bạn nên xây dựng phương thức khởi tạo của riêng lớp con. Việc khởi tạo của lớp con cũng phải bao gồm luôn việc khởi tạo những thuộc tính cha mà nó được kế thừa.

➤ Ví dụ: Xây dựng các phương thức khởi tạo cho class Rectangle sau khi kế thừa như sau:
class trong Swift

Overriding

Lớp con có thể ghi đè (override) một phương thức được kế thừa từ lớp cha để định nghĩa lại hành vi đặc trưng của riêng mình.

➤ Ví dụ: lớp Shapes có phương thức paintShape để vẽ hình. Nhưng Shapes là một hình chung chung nên cũng chưa xác định được hình cần vẽ là hình gì. Lớp con Rectangle đã được kế thừa lại từ lớp Shapes, do đó Shapes lúc này đã được xác định là hình chữ nhật. Lúc này lớp Rectangle sẽ định nghĩa lại phương thức paintShape để xác định chính xác hình cần vẽ là hình chữ nhật.
class trong Swift


Chuyển đổi kiểu (type casting)


Phần này mình sẽ xây dựng ví dụ minh hoạ để hướng dẫn phần này nhé. Giả sử chúng ta có thêm lớp Circle kế thừa từ lớp Shapes như sau:
class trong SwiftSau đó, chúng ta sẽ tạo một mảng gồm các đối tượng hình học như sau:
class trong Swift ➤ Vấn đề đặt ra: bạn có thể thấy rằng các phần tử trong mảng là các đối tượng có kiểu khác nhau. Vậy làm sao xác định kiểu dữ liệu của từng phần tử trong mảng để có hướng xử lý phù hợp.

Giải pháp: bạn có thể sử dụng toán tử is để kiểm tra kiểu dữ liệu.
class trong SwiftCó thể bạn đang thắc mắc rằng “Ừ, thì đó là kiểm tra kiểu dữ liệu thôi, vậy còn chuyển đổi kiểu đâu?“. Rõ ràng cách này đúng là chỉ kiểm tra kiểu dữ liệu thôi bạn ạ. Để chuyển đổi kiểu thì bạn sử dụng toán tử as (hoặc as? cho kiểu optional) để ép kiểu dữ liệu nhé, ví dụ:
class trong SwiftVí dụ trên chính là chuyển đổi kiểu dữ liệu của các đối tượng trong Swift đó bạn. Ngoài ra, Swift còn cung cấp thêm hai kiểu AnyObjectAny cho các kiểu chưa xác định.

  • AnyObject thể hiện cho bất kỳ một kiểu lớp nào.
  • Any thể hiện cho tất cả các kiểu, kể cả kiểu hàm.

Tổng kết


Phần này mình đã trình bày về tính kế thừa và chuyển đổi kiểu trong Swift. Đây là 02 mảnh ghép còn thiếu mà bài trước mình chưa nhắc đến. Hy vọng rằng với bài viết này sẽ giúp bạn nắm được phần nào đó về phương pháp lập trình hướng đối tượng trong Swift

0 0 votes
Đánh giá bài viết
0 Góp ý
Inline Feedbacks
View all comments