Skip to Content
Swift📘 Ngôn ngữ SwiftKế thừa (Inheritance)

Kế thừa (Inheritance) trong Swift

1. Giới thiệu

Kế thừa cho phép một class nhận các thuộc tính và phương thức từ class khác.

2. Cú pháp cơ bản

// Base class (Superclass) class Animal { var name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age } func makeSound() { print("Some sound...") } func describe() { print("\(name), \(age) tuổi") } } // Derived class (Subclass) class Dog: Animal { var breed: String init(name: String, age: Int, breed: String) { self.breed = breed super.init(name: name, age: age) } override func makeSound() { print("Gâu gâu!") } } let dog = Dog(name: "Buddy", age: 3, breed: "Golden") dog.makeSound() // Gâu gâu! dog.describe() // Buddy, 3 tuổi

3. Override Methods

class Vehicle { var speed: Double = 0 func describe() -> String { "Tốc độ: \(speed) km/h" } func accelerate() { speed += 10 } } class Car: Vehicle { var gear: Int = 1 override func describe() -> String { super.describe() + ", Số: \(gear)" } override func accelerate() { super.accelerate() if speed > 50 { gear = 2 } if speed > 100 { gear = 3 } } } let car = Car() car.accelerate() car.accelerate() print(car.describe()) // Tốc độ: 20.0 km/h, Số: 1

4. Override Properties

class Shape { var name: String { "Shape" } var sides: Int { 0 } } class Triangle: Shape { override var name: String { "Triangle" } override var sides: Int { 3 } } class Rectangle: Shape { override var name: String { "Rectangle" } override var sides: Int { 4 } var width: Double = 0 var height: Double = 0 var area: Double { width * height } }

5. Preventing Override với final

class SecureTransaction { final func validate() { // Không thể override print("Validating...") } func process() { print("Processing...") } } final class CriticalSystem { // Không thể kế thừa class này } // Error: Cannot inherit from final class // class SubSystem: CriticalSystem { }

6. Initializers và Kế thừa

class Person { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "Unknown") } } class Employee: Person { var employeeId: String init(name: String, employeeId: String) { self.employeeId = employeeId super.init(name: name) } // Override convenience override convenience init(name: String) { self.init(name: name, employeeId: "EMP000") } } let emp1 = Employee(name: "John", employeeId: "EMP001") let emp2 = Employee(name: "Jane") // employeeId = "EMP000"

7. Required Initializers

class Document { var title: String required init(title: String) { self.title = title } } class PDFDocument: Document { var pageCount: Int = 0 // Phải implement required init(title: String) { super.init(title: title) } }

8. Type Casting

class MediaItem { var name: String init(name: String) { self.name = name } } class Movie: MediaItem { var director: String init(name: String, director: String) { self.director = director super.init(name: name) } } class Song: MediaItem { var artist: String init(name: String, artist: String) { self.artist = artist super.init(name: name) } } let library: [MediaItem] = [ Movie(name: "Inception", director: "Nolan"), Song(name: "Imagine", artist: "John Lennon"), Movie(name: "Avatar", director: "Cameron") ] for item in library { if let movie = item as? Movie { print("🎬 \(movie.name) by \(movie.director)") } else if let song = item as? Song { print("🎵 \(song.name) by \(song.artist)") } }

9. Ví dụ thực tế: UI Components

class UIView { var frame: CGRect = .zero var backgroundColor: UIColor = .white func draw() { print("Drawing UIView") } } class UIButton: UIView { var title: String = "" var isEnabled: Bool = true override func draw() { super.draw() print("Drawing button: \(title)") } func tap() { if isEnabled { print("Button tapped!") } } } class UILabel: UIView { var text: String = "" var fontSize: CGFloat = 14 override func draw() { super.draw() print("Drawing label: \(text)") } }

📝 Tóm tắt

  • class SubClass: SuperClass cho kế thừa
  • override để ghi đè methods/properties
  • super.method() gọi phương thức của parent
  • final ngăn không cho override/kế thừa
  • required init bắt buộc subclass implement
  • as?as! cho type casting
Last updated on