Class trong swift – Swift Classes (Bài 7)
Tương tự như các ngôn ngữ lập trình khác, class trong swift là khuôn mẫu để tạo ra đối tượng. Bên trong một class bao gồm một hoặc nhiều thuộc tính (properties) và một hoặc nhiều phương thức.
Class trong swift được xây dựng và cho phép kế thừa. Điều đó có nghĩa là việc xây dựng một lớp mới kế thừa những thuộc tính và phương thức của lớp khác.
Class trong swift – Cú pháp
class classname {
// Khai báo thuộc tính
// Khai báo và định nghĩa phương thức (hàm)
}
Class trong swift – Ví dụ
class Student {
var studentID: Int = 0
var studentName: String = ""
var mark: Float = 0
}
Class trong swift – Cú pháp tạo đối tượng (instance)
let s = Student()
Class trong swift – Truy cập thuộc tính (Accessing Class Properties)
Thuộc tính của class có thể được truy cập bởi cú pháp ‘.‘. Tên thuộc tính được phân cách bởi một dấu ‘.’ sau tên đối tượng (instance name)
class StudentMarks {
// Khai báo thuộc tính
var diemToan = 8
var diemLy = 9
var diemHoa = 10
}
// Tạo thể hiện (object)
let sm = StudentMarks()
// Truy cập các thuộc tính của class
print("Điểm toán là \(sm.diemToan)")
print("Điểm lý là \(sm.diemLy)")
print("Điểm hoá là \(sm.diemHoa)")
Khi chạy ứng dụng trên, chúng ta sẽ nhận được kết quả sau
Điểm toán là 8
Điểm lý là 9
Điểm hoá là 10
Class trong swift – Lớp con và lớp cha (Subclass and Superclass)
Khi chúng ta xây dựng một lớp mới kế thừa lớp đã có thì hai lớp này sẽ là lớp con và lớp cha của nhau. Ví dụ chúng ta đã có lớp Person và tạo một lớp Employee kế thừa lớp Person.
Trong trường hợp này Person được gọi là Superclass (lớp cha) và Employee được gọi là Subclass (lớp con). Một lớp có thể có nhiều lớp con nhưng một lớp chỉ được phép có một lớp cha (đơn thừa kế).
Để khai báo một lớp là con của lớp khác, chúng ta thêm một dấu hai chấm (:). Sau đây là ví dụ
Tạo lớp Person
class Person {
var id : Int = 0
var name : String = "Gia Sư Tin Học"
func display () {
print("ID = \(id)")
print("Name = \(name)")
}
}
Tạo lớp Employee kế thừa lớp Person
class Employee : Person {
var diploma : String = "Ths"
func show () {
print("Diploma = \(diploma)")
}
func displayInfo() {
super.display()
self.show()
}
}
Tạo một thể hiện của lớp Employee
// Tạo đối tượng
let gsth = Employee()
// Gọi phương thức của lớp cha
print("Thông tin hiển thị sử phương thức của lớp Person")
gsth.display() //inheritance from Quadruped
// Gọi phương thức của con
print("Thông tin hiển thị sử dụng phương thức của lớp Employee")
gsth.displayInfo();
Class trong swift – Overriding method
Trong Swift, khi một phương thức được kế thừa từ lớp cha và phương thức này được định nghĩa lại ở lớp con thì được gọi là overriding method. Phương thức được định nghĩa lại phải thêm từ khoá override trong phần khai báo. Sau đây là ví dụ:
class DongVat4Chan {
func go () {
print("Di chuyển bằng 4 chân")
}
}
class ConCho : DongVat4Chan {
override func go () {
print("Con chó đi bằng 4 chân")
}
}
Tạo thể hiện và gọi phương thức
let pq = ConCho()
pq.go()
Class trong swift – Phương thức khởi tạo (Initialization)
Giống như Java, phương thức khởi tạo trong Swift được sử dụng để thiết lập giá trị ban đầu cho các thuộc tính khi tạo thể hiện của class. Trong Swift để khai báo phương thức khởi tạo, chúng ta sử dụng từ khoá init
Phương thức khởi tạo không có tham số
Cú pháp
init() {
// Khởi tạo giá trị cho các thuộc tính
}
Ví dụ
class DoF {
var nhietdo: Float
init() {
nhietdo = 23.0
}
}
// Tạo thể hiện
var df = DoF()
// Hiển thị nhiệt độ
print("Nhiệt độ mặc định là \(df.nhietdo)")
Phương thức khởi tạo có tham số
Cú pháp
init (Danh sách tham số) {
// Khởi tạo giá trị cho các thuộc tính theo tham số
}
Ví dụ 1
class DoC {
var nhietdo: Float
init(nd : Float) {
nhietdo = nd
}
}
// Tạo đối tượng
let dc = DoC(nd : 100)
print("Độ C hiện tại là \(dc.nhietdo)")
Ví dụ 2
class MyColor {
var redColor, greenColor, blueColor: Int
init(redColor: Int, greenColor: Int, blueColor: Int) {
self.redColor = redColor
self.greenColor = greenColor
self.blueColor = blueColor
}
}
// Tạo đối tượng
let mc = MyColor(redColor: 255, greenColor: 255, blueColor: 255)
Gọi phương thức khởi tạo của lớp cha
Ví dụ
class NewPerson {
var id : Int
init(id : Int) {
self.id = id
}
}
class NewEmployee : NewPerson {
var name : String
init(id : Int, name : String) {
self.name = name
// Gọi phương thức khởi tạo của lớp cha
super.init(id:id)
}
}
let ne1 = NewEmployee(id: 7, name: "giasutinhoc.vn")
print("Mã nhân viên: \(ne1.id)")
print("Tên nhân viên: \(ne1.name)")
Kết quả hiển thị trong playground
Class trong swift – Tổng kết
- Lớp
- Đối tượng
- Thuộc tính
- Kế thừa
- Định nghĩa lại phương thức
- Phương thức khởi tạo
Class trong swift – Bài tập thực hành
Tạo một ứng dụng sử dụng class và kế thừa để cài đặt một phần mềm. Ứng dụng bao gồm các class sau
Lớp Game có các thuộc tính để lưu thông tin của người chơi như name, age, gender, …
Lớp TestMatch kế thừa lớp Game và có hàm Float calculateIncome(String numGames) để tính thu nhập của người chơi. Giả sử ở cấp độ Test có 5 game. Game 1 tiền nhận được là 100$, game 2 tiền nhận được là 200$, ….Hàm Float calculateBonus(String performance, String grade) để tính tiền thưởng dựa vào hiệu suất (performance) trong một trận đấu và hạng (grade). Hiệu suất bao gồm good, average và best. Hạng bao gồm A, B và C. Giả sử hiệu suất là good và hạng A thì tiền thưởng là 10$, …
Lớp WorldCup kế thừa lớp Game và cũng có hàm Float calculateIncome(String numGames) để tính thu nhập và hàm Float calculateBonus(String performance, String grade) tiền thưởng của người chơi ở cấp độ WorldCup. Cách tính thu nhập và tiền thưởng tương tự TestMatch tuy nhiên số tiền sẽ cao hơn.
Lớp Player có một hàm displayDetails(String match) để hiển thị thông tin của người chơi. Trong hàm displayDetails(String match) sẽ gọi hàm calculateIncome() và calculateBonus() của lớp TestMatch hoặc lơp WorldCup dựa vào match được chỉ định bởi người dùng.