为某公司编写一个工资支付系统,用于计算某一类员工的月薪。该公司共有四类员工:领固定月薪的(SalariedEmployee);计时取酬的(HourlyEmployee,如果一月工时超过160小时,则还需对额外的工时支付加班费);按销售额提成(CommissionEmployee)的和带底薪并按销售额提成的(BasePlusCommissionEmployee),其继承层次结构如下所示。已知每类员工均有表示员工工号、姓名和出生年月的属性,和用于计算员工月薪的方法。创建一个Employee变量数组,保存Employee类层次结构中每个具体类对象的引用,对每个Employee显示其工号、姓名、出生年月和月收入,如果当月是Employee的生日所在的月份,则还另发给他100月作为红包。
时间: 2024-02-27 22:55:04 浏览: 125
好的,这是一个经典的面向对象设计问题。我们可以先定义一个Employee类,然后让不同类型的员工类继承Employee类,最后在主程序中创建一个Employee变量数组,并对每个Employee显示其相关信息。
首先,我们定义一个Employee类,它有员工工号、姓名和出生年月三个属性,以及一个计算月收入的方法getMonthlySalary。代码如下:
```python
import datetime
class Employee:
def __init__(self, emp_id, name, birthdate):
self.emp_id = emp_id
self.name = name
self.birthdate = birthdate
def getMonthlySalary(self):
pass
```
接下来,我们定义四个不同类型的员工类,它们分别继承Employee类,并实现自己的计算月收入的方法。
第一个是领固定月薪的SalariedEmployee类,它的月薪就是固定的工资。代码如下:
```python
class SalariedEmployee(Employee):
def __init__(self, emp_id, name, birthdate, monthly_salary):
super().__init__(emp_id, name, birthdate)
self.monthly_salary = monthly_salary
def getMonthlySalary(self):
return self.monthly_salary
```
第二个是计时取酬的HourlyEmployee类,它的月薪是按照工时和时薪计算的。如果一月工时超过160小时,则还需对额外的工时支付加班费。代码如下:
```python
class HourlyEmployee(Employee):
def __init__(self, emp_id, name, birthdate, hourly_wage, hours_worked):
super().__init__(emp_id, name, birthdate)
self.hourly_wage = hourly_wage
self.hours_worked = hours_worked
def getMonthlySalary(self):
if self.hours_worked <= 160:
return self.hourly_wage * self.hours_worked
else:
overtime_pay = (self.hours_worked - 160) * self.hourly_wage * 1.5
return self.hourly_wage * 160 + overtime_pay
```
第三个是按销售额提成的CommissionEmployee类,它的月薪是按照销售额和提成比例计算的。代码如下:
```python
class CommissionEmployee(Employee):
def __init__(self, emp_id, name, birthdate, sales, commission_rate):
super().__init__(emp_id, name, birthdate)
self.sales = sales
self.commission_rate = commission_rate
def getMonthlySalary(self):
return self.sales * self.commission_rate
```
第四个是带底薪并按销售额提成的BasePlusCommissionEmployee类,它的月薪是按照销售额、提成比例和底薪计算的。代码如下:
```python
class BasePlusCommissionEmployee(Employee):
def __init__(self, emp_id, name, birthdate, sales, commission_rate, base_salary):
super().__init__(emp_id, name, birthdate)
self.sales = sales
self.commission_rate = commission_rate
self.base_salary = base_salary
def getMonthlySalary(self):
return self.base_salary + self.sales * self.commission_rate
```
最后,在主程序中创建Employee变量数组,保存Employee类层次结构中每个具体类对象的引用,并对每个Employee显示其工号、姓名、出生年月和月收入,如果当月是Employee的生日所在的月份,则还另发给他100月作为红包。代码如下:
```python
employees = [
SalariedEmployee("E001", "Alice", datetime.date(1990, 1, 1), 2000),
HourlyEmployee("E002", "Bob", datetime.date(1995, 2, 2), 20, 180),
CommissionEmployee("E003", "Charlie", datetime.date(1985, 3, 3), 30000, 0.05),
BasePlusCommissionEmployee("E004", "David", datetime.date(1980, 4, 4), 40000, 0.03, 3000)
]
today = datetime.date.today()
for emp in employees:
monthly_salary = emp.getMonthlySalary()
if emp.birthdate.month == today.month:
monthly_salary += 100
print("Emp ID: {}, Name: {}, Birthdate: {}, Monthly Salary: {}".format(emp.emp_id, emp.name, emp.birthdate, monthly_salary))
```
这样就完成了整个工资支付系统的设计和实现。
阅读全文