Bỏ qua để đến nội dung

Kế thừa (Inheritance)

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.

// 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
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
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 }
}
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 { }
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"
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)
}
}
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)")
}
}
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)")
}
}

  • 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