Class trong swift – Swift Classes (Bài 7)

Class trong swift – Swift Classes (Bài 7)

class trong swift
Lập trình swift

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

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.

Alert: You are not allowed to copy content or view source !!