Kế thừa (Inheritance)
1. Giới thiệu
Phần tiêu đề “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
Phần tiêu đề “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ổi3. Override Methods
Phần tiêu đề “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ố: 14. Override Properties
Phần tiêu đề “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
Phần tiêu đề “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
Phần tiêu đề “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
Phần tiêu đề “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
Phần tiêu đề “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
Phần tiêu đề “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
Phần tiêu đề “📝 Tóm tắt”class SubClass: SuperClasscho kế thừaoverrideđể ghi đè methods/propertiessuper.method()gọi phương thức của parentfinalngăn không cho override/kế thừarequired initbắt buộc subclass implementas?vàas!cho type casting