Last active
July 7, 2020 19:33
-
-
Save santosh/ab2228279e0924b4142befa85aa59a50 to your computer and use it in GitHub Desktop.
Getting started with interfaces.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import "fmt" | |
type SalaryCalculator interface { | |
CalculateSalary() int | |
} | |
type Permanent struct { | |
empId int | |
basicpay int | |
pf int | |
} | |
type Contract struct { | |
empId int | |
basicpay int | |
} | |
type Freelancer struct { | |
empId int | |
ratePerHour int | |
totalHours int | |
} | |
// salary of permanent employee is the sum of basi pay and pf | |
func (p Permanent) CalculateSalary() int { | |
return p.basicpay + p.pf | |
} | |
// salary of contract employee is the basic pay alone | |
func (c Contract) CalculateSalary() int { | |
return c.basicpay | |
} | |
// salary of freelancer | |
func (f Freelancer) CalculateSalary() int { | |
return f.ratePerHour * f.totalHours | |
} | |
/* | |
total expense is calculated by iterating through the SalaryCalculator | |
slice and summing the salaries of the individual employees | |
*/ | |
func totalExpense(s []SalaryCalculator) { | |
expense := 0 | |
for _, v := range s { | |
expense = expense + v.CalculateSalary() | |
} | |
fmt.Printf("Total Expense Per Month $%d", expense) | |
} | |
func main() { | |
pemp1 := Permanent{ | |
empId: 1, | |
basicpay: 5000, | |
pf: 20, | |
} | |
pemp2 := Permanent{ | |
empId: 2, | |
basicpay: 6000, | |
pf: 30, | |
} | |
cemp1 := Contract{ | |
empId: 3, | |
basicpay: 3000, | |
} | |
freelancer1 := Freelancer{ | |
empId: 4, | |
ratePerHour: 70, | |
totalHours: 120, | |
} | |
freelancer2 := Freelancer{ | |
empId: 5, | |
ratePerHour: 100, | |
totalHours: 100, | |
} | |
employees := []SalaryCalculator{pemp1, pemp2, cemp1, freelancer1, freelancer2} | |
totalExpense(employees) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Edit 2
Practical use of interface. The biggest advantage of this is that
totalExpense
can be extended to any new employee type without any code changes. Let's say the company adds a new type of employee Freelancer with a different salary structure. This Freelancer can just be passed in the slice argument tototalExpense
without even a single line of code change to thetotalExpense
function. This method will do what it's supposed to do as Freelancer will also implement the SalaryCalculator interface :).