Mục Lục
Tổng quan
Bạn có thể sử dụng từ khóa override
để ghi đè (override) các phương thức, thuộc tính, hoặc subscripts trong lớp con (subclass) để thay đổi hoặc mở rộng hành vi của chúng so với lớp cha (superclass). Tuy nhiên, để có thể override, phương thức hoặc thuộc tính đó phải được khai báo là open
hoặc public
. Một số điều cần lưu ý:
- Phương Thức và Thuộc Tính:
- Để override một phương thức hoặc thuộc tính, chúng phải được khai báo là
open
hoặcpublic
trong lớp cha. - Ở lớp con, sử dụng từ khóa
override
trước phương thức hoặc thuộc tính đó.
- Để override một phương thức hoặc thuộc tính, chúng phải được khai báo là
class Superclass {
open func someMethod() {
// ...
}
}
class Subclass: Superclass {
override func someMethod() {
// Ghi đè phương thức
// ...
}
}
Subscripts:
- Subscripts cũng có thể được override nếu chúng được khai báo là
open
hoặcpublic
trong lớp cha.
class Superclass {
open subscript(index: Int) -> String {
return "Value at index \(index)"
}
}
class Subclass: Superclass {
override subscript(index: Int) -> String {
// Ghi đè subscript
return "New value at index \(index)"
}
}
Lớp Con Phải Được Kế Thừa từ Lớp Cha:
- Lớp con cần phải kế thừa từ lớp cha để có thể override các thành phần của lớp cha.
class Subclass: Superclass {
// Lớp con kế thừa từ lớp cha
override func someMethod() {
// ...
}
}
Tính Tuân Thủ (Conformance) Đối Với Protocol:
- Bạn cũng có thể override các phương thức và thuộc tính của protocol nếu lớp con tuân thủ (conforms to) protocol đó.
protocol MyProtocol {
func myMethod()
}
class Subclass: MyProtocol {
func myMethod() {
// Override phương thức của protocol
}
}
Lưu ý rằng, việc sử dụng open
hoặc public
để khai báo phương thức hoặc thuộc tính ở lớp cha là quan trọng để cho phép các lớp con override chúng.
Ví dụ
Dưới đây là một ví dụ cụ thể về cách sử dụng override
để ghi đè một phương thức và một thuộc tính trong Swift:
class Animal {
var name: String
init(name: String) {
self.name = name
}
func makeSound() {
print("Animal makes a sound")
}
}
class Dog: Animal {
var breed: String
init(name: String, breed: String) {
self.breed = breed
super.init(name: name)
}
// Ghi đè phương thức makeSound
override func makeSound() {
print("Dog barks")
}
// Ghi đè thuộc tính name
override var name: String {
didSet {
print("Dog's name is updated to \(name)")
}
}
}
let myDog = Dog(name: "Buddy", breed: "Golden Retriever")
myDog.makeSound() // In ra: "Dog barks"
myDog.name = "Max" // In ra: "Dog's name is updated to Max"
Trong ví dụ trên:
Animal
là lớp cha với một thuộc tínhname
và một phương thứcmakeSound
.Dog
là lớp con kế thừa từAnimal
và mở rộng nó bằng cách thêm một thuộc tínhbreed
.- Lớp con
Dog
ghi đè phương thứcmakeSound
để thay đổi hành vi mặc định của nó. - Lớp con
Dog
cũng ghi đè thuộc tínhname
để theo dõi sự thay đổi của giá trị và thực hiện một hành động nào đó khi giá trị thay đổi.
Khi bạn tạo một đối tượng từ lớp Dog
, bạn có thể thấy rằng nó kế thừa và ghi đè các phương thức và thuộc tính từ lớp cha Animal
.
Xin chào,
99,99% nội dung trên website này là nhờ hỏi ChatGPT, rồi mình biên tập lại để dễ hiểu và dùng lâu dài. Một vài bài tự viết, còn lại là “làm việc nhóm với AI”
Mình lưu tại đây để tra cứu, học tập và chia sẻ với bạn bè. Nếu bạn tìm được gì hữu ích, cứ đọc thoải mái – miễn phí, không quảng cáo.
Mình cũng có vài app cá nhân:
QuestionBank – Ôn thi vào 10 (iOS, Android)
TypingTest by QuestionBank (iOS, Android)
Cảm ơn bạn đã ghé qua!