[Swift] Khám phá tính kế thừa trong Swift: Từ cơ bản đến nâng Cao

Xin chào các bạn! Hôm nay, chúng ta sẽ đi sâu vào một khía cạnh quan trọng của lập trình hướng đối tượng trong Swift: tính kế thừa của Class. Chúng ta sẽ bắt đầu với một ví dụ đơn giản, sau đó mở rộng nó để khám phá các khía cạnh nâng cao hơn.

Ví Dụ Cơ Bản về Kế Thừa

Hãy bắt đầu với một ví dụ đơn giản về Vehicle (Phương tiện) và Car (Xe hơi):

class Vehicle {
    var wheels: Int
    var color: String
    
    init(wheels: Int, color: String) {
        self.wheels = wheels
        self.color = color
    }
    
    func describe() {
        print("This vehicle has \(wheels) wheels and is \(color).")
    }
}

class Car: Vehicle {
    var brand: String
    
    init(color: String, brand: String) {
        self.brand = brand
        super.init(wheels: 4, color: color)
    }
}

let myCar = Car(color: "red", brand: "Toyota")
myCar.describe() // Output: This vehicle has 4 wheels and is red.
print(myCar.brand) // Output: Toyota

Trong ví dụ này, Car kế thừa từ Vehicle, thừa hưởng các thuộc tính và phương thức của nó, đồng thời thêm thuộc tính brand của riêng mình.

Nâng Cao: Hiệu Chỉnh và Mở Rộng

Bây giờ, hãy mở rộng ví dụ trên để thấy cách chúng ta có thể tùy chỉnh và mở rộng lớp con:

class Vehicle {
    var wheels: Int
    var color: String
    
    init(wheels: Int, color: String) {
        self.wheels = wheels
        self.color = color
    }
    
    func describe() {
        print("This vehicle has \(wheels) wheels and is \(color).")
    }
    
    func makeSound() {
        print("Generic vehicle sound")
    }
}

class Car: Vehicle {
    var brand: String
    
    // Hiệu chỉnh thuộc tính kế thừa
    override var color: String {
        didSet {
            print("The car's color has been changed to \(color)")
        }
    }
    
    init(color: String, brand: String) {
        self.brand = brand
        super.init(wheels: 4, color: color)
    }
    
    // Định nghĩa lại method
    override func describe() {
        super.describe()
        print("It's a \(brand) car.")
    }
    
    override func makeSound() {
        print("Vroom vroom!")
    }
    
    // Thêm method mới
    func honk() {
        print("Beep beep!")
    }
}

let myCar = Car(color: "red", brand: "Toyota")
myCar.describe() 
myCar.makeSound()
myCar.honk()
myCar.color = "blue"

Giải Thích Chi Tiết

  1. Override Thuộc Tính: Chúng ta đã override thuộc tính color trong Car để thêm một didSet observer. Điều này cho phép chúng ta thực hiện hành động cụ thể khi màu xe thay đổi.

  2. Override Method: Method describe() được override trong Car. Nó gọi super.describe() để giữ chức năng của lớp cha, sau đó thêm thông tin về thương hiệu xe.

  3. Thay Đổi Hoàn Toàn Method: Method makeSound() được override hoàn toàn trong Car để tạo âm thanh đặc trưng của xe hơi.

  4. Thêm Method Mới: Một method mới honk() được thêm vào Car, cho thấy lớp con có thể mở rộng chức năng so với lớp cha.

Kết Luận

Thông qua ví dụ này, chúng ta đã thấy cách class con (Car) có thể kế thừa, hiệu chỉnh và mở rộng các thuộc tính và phương thức từ class cha (Vehicle), đồng thời thêm các chức năng mới của riêng nó. Đây là sức mạnh của tính kế thừa trong lập trình hướng đối tượng!

Hy vọng bài viết này giúp bạn hiểu rõ hơn về tính kế thừa trong Swift. Hãy thử nghiệm với code và khám phá thêm nhé!