活动介绍
file-type

Java多态案例解析:代码重用与冗余消除

RAR文件

下载需积分: 10 | 49KB | 更新于2025-01-31 | 128 浏览量 | 9 下载量 举报 1 收藏
download 立即下载
多态是面向对象编程的核心概念之一,它允许我们使用父类的引用来指向子类的对象,并通过这个引用来调用在子类中重写的方法。多态可以实现代码的重用,去除冗余代码,并且使程序更加灵活和可扩展。下面,我们将通过一个关于员工工资计算的经典案例,从四个不同层次对Java中的多态进行解析。 ### 1. 类层次结构设计 首先,我们需要定义一个员工的基类,我们可以称之为`Employee`,在该类中定义共有的属性和方法。接下来,我们可以创建两个子类,分别是`Programmer`(程序员)和`ProjectManager`(项目经理),这两个类继承自`Employee`类,并各自实现自己的工资计算方法。 ```java // 员工基类 public class Employee { protected String id; protected String name; protected String gender; protected double baseSalary; public Employee(String id, String name, String gender, double baseSalary) { this.id = id; this.name = name; this.gender = gender; this.baseSalary = baseSalary; } // 基本工资计算方法 public double calculateSalary() { return baseSalary; } } // 程序员类 public class Programmer extends Employee { private int overtimeHours; public Programmer(String id, String name, String gender, double baseSalary, int overtimeHours) { super(id, name, gender, baseSalary); this.overtimeHours = overtimeHours; } // 程序员工资计算方法 @Override public double calculateSalary() { return super.calculateSalary() + overtimeHours * 50; } } // 项目经理类 public class ProjectManager extends Employee { private double managementBonus; public ProjectManager(String id, String name, String gender, double baseSalary, double managementBonus) { super(id, name, gender, baseSalary); this.managementBonus = managementBonus; } // 项目经理工资计算方法 @Override public double calculateSalary() { return super.calculateSalary() + managementBonus; } } ``` ### 2. 接口与抽象类 为了更好地实现多态,我们还可以定义一个工资计算的接口`SalaryCalculator`,这样可以让`Employee`类成为一个抽象类,而不直接实现工资计算方法。然后让`Programmer`和`ProjectManager`实现这个接口。 ```java // 工资计算接口 public interface SalaryCalculator { double calculateSalary(); } // 抽象员工类 public abstract class Employee { // ... 同上省略属性和构造器 ... public abstract double calculateSalary(); } // 程序员实现工资计算接口 public class Programmer extends Employee implements SalaryCalculator { // ... 同上省略属性和构造器 ... @Override public double calculateSalary() { return super.calculateSalary() + overtimeHours * 50; } } // 项目经理实现工资计算接口 public class ProjectManager extends Employee implements SalaryCalculator { // ... 同上省略属性和构造器 ... @Override public double calculateSalary() { return super.calculateSalary() + managementBonus; } } ``` ### 3. 集合与多态操作 我们可以创建一个`Employee`类型的集合,将`Programmer`和`ProjectManager`对象放入同一个集合中,然后利用多态性来遍历集合,并调用每个对象的`calculateSalary()`方法计算工资。 ```java import java.util.ArrayList; import java.util.List; public class SalaryCalculatorDemo { public static void main(String[] args) { List<Employee> employees = new ArrayList<>(); employees.add(new Programmer("001", "张三", "男", 8000, 10)); employees.add(new ProjectManager("002", "李四", "女", 10000, 2000)); for (Employee employee : employees) { System.out.println(employee.getName() + "的工资是:" + employee.calculateSalary()); } } } ``` ### 4. 策略模式 策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响到使用算法的客户端。在这个案例中,我们可以将不同的工资计算方法封装起来,作为一个个策略,让`Employee`类根据不同的子类来选择不同的策略。 ```java // 工资计算策略接口 public interface SalaryStrategy { double calculateSalary(Employee employee); } // 程序员工资计算策略 public class ProgrammerSalaryStrategy implements SalaryStrategy { @Override public double calculateSalary(Employee employee) { Programmer programmer = (Programmer) employee; return programmer.getBaseSalary() + programmer.getOvertimeHours() * 50; } } // 项目经理工资计算策略 public class ProjectManagerSalaryStrategy implements SalaryStrategy { @Override public double calculateSalary(Employee employee) { ProjectManager projectManager = (ProjectManager) employee; return projectManager.getBaseSalary() + projectManager.getManagementBonus(); } } // 工资计算策略应用 public class SalaryCalculatorContext { private SalaryStrategy strategy; public SalaryCalculatorContext(SalaryStrategy strategy) { this.strategy = strategy; } public double calculateSalary(Employee employee) { return strategy.calculateSalary(employee); } } ``` 在以上不同的层次中,我们都展示了如何利用多态机制来设计和实现程序,以及如何通过多态去除冗余代码,提高代码的可维护性和可扩展性。通过这些层次化的解析,我们可以更好地理解和应用Java中的多态概念。

相关推荐