2020.07.22

Tính đa hình (Polymorphism) trong lập trình hướng đối tượng

tinh da hinh 1

Tính đa hình là một trong bốn tính chất cơ bản của lập trình hướng đối tượng.

Trong bài viết này chúng ta sẽ cùng tìm hiểu về tính đa hình nhé.

Định nghĩa:

Tính đa hình (Polymorphism) là một đối tượng có thể thực hiện một tác vụ theo nhiều cách khác nhau.

 

Công dụng:

Kỹ thuật đa hình trong các ngôn ngữ hướng đối tượng giúp cho chúng ta gia tăng khả năng tái sử dụng các đoạn mã (code) được viết một cách tổng quát và có thể thay đổi các ứng xử một cách linh hoạt tùy theo đối tượng.

 

Cách sử dụng:

Trong lập trình sẽ có 2 kỹ thuật để chúng ta có thể sử tính đa hình đó là Override và Overloading.

 

Override (Ghi đè):

Ví dụ: Trong một công ty sẽ có các nhân viên như lập trình viên, kế toán, nhân viên sale. Mỗi nhân viên sẽ có những cách tính lương khác nhau.

Dựa trên ví dụ, chúng ta sẽ có class Staff đại diện cho nhân viên và có thuộc tính salary là mức lương cơ bản.

 

class Staff {
   public int salary = 3;

   public int countSalary() {
       return this.salary;
   }
}

 

Tiếp theo chúng ta có class Developer kế thừa class Staff và sẽ ghi đè lên phương thức tính lương.

class Developer extends Staff {
   public int rank = 4;
  
   @Override
   public int countSalary() {
       return this.salary * this.rank;
   }
}

 

Nhân viên kế toán có thêm trợ cấp nên mỗi lần tính lương sẽ được cộng thêm. Nên ta có class Accountant khác với class Developer.

class Accountant extends Staff {
   public int rank = 3;
   public int allowance = 3;

   @Override
   public int countSalary() {
       return (this.salary * this.rank) + this.allowance;
   }
}


Overloading (Nạp chồng):

Quay lại ví dụ trên, trong quá trình làm việc, sẽ có lúc lập trình viên phải tăng ca, vì vậy khoản tiền tăng ca này sẽ được cộng thêm vào lương. Nếu không tăng ca, thì lương của lập trình viên sẽ được tính theo công thức như bình thường.

class Developer extends Staff {
   public int rank = 4;
  
   @Overload
   public int countSalary() {
       return this.salary * this.rank;
   }

   @Overload
   public int countSalary(int overtime_money) {
       return (this.salary * this.rank) + overtime_money;
   }
}

 

public class Demo {
 
    public static void main(String[] args) { 
        Developer developer = new Developer();
 
        System.out.println("Basic salary:" + developer.countSalary());
        System.out.println("Salary with overtime money: " + developer.countSalary(2));
    }
}

 

Output:

Basic salary: 12
Salary with overtime money: 14

 

Khi chạy chương trình chúng ta sẽ thấy dựa theo tham số đầu vào chương trình sẽ điều hướng tới phương thức tương ứng.