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ổi3. 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
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: 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
Last updated on
Swift