Runtime Polymorphism trong Go

Post on: 2023-04-17 22:52:26 | in: Golang
Runtime Polymorphism là một tính năng quan trọng của OOP, cho phép chúng ta viết các phương thức có cùng tên, nhưng khác nhau về hành vi, tùy thuộc vào đối tượng được sử dụng.

RunTime Polymorphism có nghĩa là một cuộc gọi được giải quyết tại thời điểm runtime. Điều này được đạt được trong Go bằng cách sử dụng các interface.

Hãy hiểu rõ hơn với một ví dụ. Các quốc gia khác nhau có cách tính thuế khác nhau. Điều này có thể được đại diện bằng cách sử dụng một interface.

type taxCalculator interface{
    calculateTax()
}

Bây giờ, các quốc gia khác nhau có thể có cấu trúc riêng của họ và có thể triển khai phương thức calculateTax(). Ví dụ, đối với cấu trúc indianTax có thể được biểu diễn như sau. Nó cũng có thể định nghĩa một phương thức calculateTax() có thể thực hiện tính toán thực tế dựa trên phần trăm.

Tương tự, hệ thống thuế của các quốc gia khác nhau cũng có thể được biểu diễn bằng một cấu trúc và họ cũng có thể triển khai phương thức calculateTax() riêng của họ để cung cấp giá trị thuế của họ.

Bây giờ, chúng ta hãy xem làm thế nào để sử dụng interface taxCalcuator để tính toán thuế của một người định cư ở các quốc gia khác nhau trong các phần khác nhau của năm. Xem chương trình đầy đủ bên dưới để tham khảo.

package main

import "fmt"

type taxSystem interface {
    calculateTax() int
}
type indianTax struct {
    taxPercentage int
    income        int
}
func (i *indianTax) calculateTax() int {
    tax := i.income * i.taxPercentage / 100
    return tax
}
type singaporeTax struct {
    taxPercentage int
    income        int
}
func (i *singaporeTax) calculateTax() int {
    tax := i.income * i.taxPercentage / 100
    return tax
}
type usaTax struct {
    taxPercentage int
    income        int
}
func (i *usaTax) calculateTax() int {
    tax := i.income * i.taxPercentage / 100
    return tax
}
func main() {
    indianTax := &indianTax{
        taxPercentage: 30,
        income:        1000,
    }
    singaporeTax := &singaporeTax{
        taxPercentage: 10,
        income:        2000,
    }

    taxSystems := []taxSystem{indianTax, singaporeTax}
    totalTax := calculateTotalTax(taxSystems)

    fmt.Printf("Total Tax is %d\n", totalTax)
}
func calculateTotalTax(taxSystems []taxSystem) int {
    totalTax := 0
    for _, t := range taxSystems {
        totalTax += t.calculateTax() //This is where runtime polymorphism happens
    }
    return totalTax
}

Output:

Total Tax is 300

Dưới đây là dòng mã mà polymorphism thời gian chạy xảy ra.

totalTax += t.calculateTax() //This is where runtime polymorphism happens

Hàm calculateTax được sử dụng trong các ngữ cảnh khác nhau để tính toán thuế. Khi trình biên dịch gặp cuộc gọi này, nó sẽ trì hoãn việc quyết định chính xác phương thức nào được gọi cho đến thời điểm chạy chương trình. Phép biến đổi này xảy ra phía sau về mặt kỹ thuật. Nếu bạn quan tâm đến cách phép biến đổi này hoạt động, hãy tham khảo đường dẫn này.

Mở rộng chương trình để thêm các hệ thống thuế khác:

Tiếp theo, chúng ta sẽ mở rộng chương trình trên để bao gồm hệ thống thuế cho các quốc gia khác, chẳng hạn như Mỹ.

type usaTax struct {
    taxPercentage int
    income        int
}

func (i *usaTax) calculateTax() int {
    tax := i.income * i.taxPercentage / 100
    return tax
}

Chúng ta chỉ cần thay đổi hàm main để thêm hệ thống thuế của Mỹ.

func main() {
    indianTax := &indianTax{
        taxPercentage: 30,
        income:        1000,
    }
    singaporeTax := &singaporeTax{
        taxPercentage: 10,
        income:        2000,
    }
    usaTax := &usaTax{
        taxPercentage: 40,
        income:        500,
    }

    taxSystems := []taxSystem{indianTax, singaporeTax, usaTax}
    totalTax := calculateTotalTax(taxSystems)
    fmt.Printf("Total Tax is %d\n", totalTax)
}
func calculateTotalTax(taxSystems []taxSystem) int {
    totalTax := 0
    for _, t := range taxSystems {
        totalTax += t.calculateTax()
    }
    return totalTax
}

Output:

Total Tax is 700

Nếu bạn chú ý trong chương trình trên, hàm calculateTotalTax không cần phải thay đổi để tính toán thuế cho hệ thống thuế của Mỹ. Đó là lợi ích của giao diện và đa hình.

Tag: go Golang nâng cao