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,
Bài viết này sử dụng AI ChatGPT để viết sau đó được lựa chọn, biên tập lại nội dung, chỉ một phần nhỏ các bài là tôi tự viết. Nội dung thể hiện ý chí cá nhân về các vấn đề, giải pháp. Tôi lưu tại website này để học, tra cứu và chia sẻ.
Tôi là Minh, sống tại Hà Nội, kỹ sư phần mềm với hơn 20 năm kinh nghiệm. Các ngôn ngữ yêu thích của tôi là Swift, Objective-C, Java, Kotlin, .NET, HTML, JavaScript, CSS, Bootstrap, jQuery, AngularJS, Angular…
Các bạn có thể tải app của tôi trên App Store hoặc Google Play:
QuestionBank-Ôn thi vào 10: phiên bản iOS, phiên bản Android
TypingTest by QuestionBank: phiên bản iOS, phiên bản Android
Xin cảm ơn,
Minh