evilgod528 2012-03-09 11:30
浏览 196
已采纳

做练习时碰到的问题,想不到怎么实现,希望大家给个思路

问题描述是这样的:

某公司有总经理、经理、普通员工三个对象,普通员工包含“姓名”、“工号”、“职位”、“工资”、“奖金”,六个private属性,试用继承来实现这三个对象。

并且要求:
1、员工的工资和奖金自己无法修改,只能查看
2、经理可以给普通员工发放工资,但是没法给自己发工资和奖金
3、总经理可以给普通员工和经理发工资和奖金,总经理自己的工资和奖金为固定值。

我的问题是:

经理继承员工的话,既然父类(员工)中工资和奖金是private属性,那么子类要修改这两个值就必须父类提供非private的方法对它进行操作,但是如果父类有存在非private的方法的话,那么父类的实例化对象不就存在方法对“工资”“奖金”进行修改了嘛?现实中就反应出员工可以自己给自己发工资和奖金的问题了。

是我实现方向错了,还是怎么弄呢,晕死了。。。。。
  • 写回答

6条回答 默认 最新

  • iteye_16709 2012-03-18 14:28
    关注

    把代码切出来供大家讨论:
    [code="java"]
    public interface DoSalary {

    /**
     * 发薪水/奖金
     * @param emp 
     * @param salary
     * @param reward
     */
    void doSalaryForStaff(Employee emp,double salary,double reward);
    
    /**
     * 添加员工
     * @param emp
     */
    void addStaff(Employee emp);
    
    /**
     * 删除员工
     * @param emp
     */
    void removeStaff(Employee emp);
    

    }
    [/code]

    [code="java"]
    public class Employee {

    /**
     * 个人基本信息
     */
    private EmployeeInfo baseInfo;
    
    public Employee(EmployeeInfo baseInfo) {
        this.baseInfo = baseInfo;
    }
    
    public EmployeeInfo getBaseInfo() {
        return baseInfo;
    }
    

    }
    [/code]

    [code="java"]
    public class Manager extends Employee implements DoSalary,Comparable{

    /**
     * 存储下属员工。
     */
    private Map<String, Employee> staffs;
    
    public Manager(EmployeeInfo baseInfo) {
        super(baseInfo);
        if(baseInfo.getPower()== EmployeeInfo.POWER.NORMAL) {
            throw new IllegalArgumentException("普通员工不能作为经理。");
        }
        if(baseInfo.getPower()== EmployeeInfo.POWER.PRESIDENT) {
            //总经理的薪水、奖金是固定值。
            baseInfo.setSalary(10000);
            baseInfo.setReward(2000);
            System.out.println(baseInfo.getName()+"你是总经理你的工资和奖金是定值。工资:10000¥,奖金:2000");
        }
    }
    
    public Map<String, Employee> getStaffs() {
        if(staffs == null) {
            staffs = new HashMap<String, Employee>();
        }
        return staffs;
    }
    
    /**
     * 发薪水
     */
    @Override
    public void doSalaryForStaff(Employee emp,double salary,double reward) {
        if(this == emp) {
            System.out.println("你不能给自己发工资。");
            return;
        }
        if(getBaseInfo().getPower() !=EmployeeInfo.POWER.PRESIDENT&&
                !getStaffs().containsKey(emp.getBaseInfo().getNumber())) {
            System.out.println(emp.getBaseInfo().getName()+"不是你的员工你不能给发工资。");       
        }
        int power = compareTo(emp);
        if(power > 0) {//权限大
            emp.getBaseInfo().setSalary(salary);
            emp.getBaseInfo().setReward(reward);
            System.out.println(this.getBaseInfo().getName()
                    +"给"+emp.getBaseInfo().getName()+"发工资:"+salary+"¥"+
                    " 发奖金:"+reward+"¥。");
        } else {//权限小
            System.out.println("你不能添加比你级别高或者同级别的人发工资。");
        }
    }
    
    @Override
    public void addStaff(Employee emp) {
        int power = compareTo(emp);
        if(power == 1) {
            getStaffs().put(emp.getBaseInfo().getNumber(), emp);
        } else {
            System.out.println("你不能添加比你级别高或者同级别的人作为你的下属员工。");
        }
    }
    
    @Override
    public void removeStaff(Employee emp) {
        getStaffs().remove(emp.getBaseInfo().getNumber());
    }
    
    /**
     * 比较权限
     */
    @Override
    public int compareTo(Employee emp) {
        EmployeeInfo.POWER self = this.getBaseInfo().getPower();
        EmployeeInfo.POWER other = emp.getBaseInfo().getPower();
        return self.compareTo(other);
    }
    

    }
    [/code]

    [code="java"]
    public class NormalEMP extends Employee {

    public NormalEMP(EmployeeInfo baseInfo) {
        super(baseInfo);
        if(baseInfo.getPower()!= EmployeeInfo.POWER.NORMAL) {
            throw new IllegalArgumentException("你是经理不是普通员工。");
        }
    }
    

    }
    [/code]

    [code="java"]
    /**

    • 员工类
      *
      /
      public class EmployeeInfo {
      /
      *

      • 姓名 */ private String name;

      /**

      • 性别 */ private SEX sex;

      /**

      • 工号 */ private String number;

      /**
      *职位
      */
      private String position;

      /**

      • 工资 */ private double salary;

      /**

      • 奖金 */ private double reward;

      /**

      • 权限 */ private POWER power;

      /**

      • 权限:普通,经理,总经理 */ public enum POWER{NORMAL,MANAGER,PRESIDENT};

      /**
      *性别:男、女
      */
      public enum SEX{MALE,FEMALE};

      public EmployeeInfo(String name,String number,POWER power) {
      if(name==null||number==null||power == null) {
      throw new IllegalArgumentException("员工不能没有姓名、工号、权限。");
      }
      this.name = name;
      this.number = number;
      this.power = power;
      }

      public String getName() {
      return name;
      }

      public void setName(String name) {
      this.name = name;
      }

      public SEX getSex() {
      return sex;
      }

      public void setSex(SEX sex) {
      this.sex = sex;
      }

      public String getNumber() {
      return number;
      }

      public void setNumber(String number) {
      this.number = number;
      }

      public String getPosition() {
      return position;
      }

      public void setPosition(String position) {
      this.position = position;
      }

      public double getSalary() {
      return salary;
      }

      public void setSalary(double salary) {
      this.salary = salary;
      }

      public double getReward() {
      return reward;
      }

      public void setReward(double reward) {
      this.reward = reward;
      }

      public POWER getPower() {
      return power;
      }

      public void setPower(POWER power) {
      this.power = power;
      }
      }
      [/code]

    [code="java"]
    public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
    /**
     *                      总经理(张三)
     *                          |
     *          ---------------------------------
     *          |                               |
     *      经理(李四)                      经理(王五)
     *          |                               |
     *  -----------------               ----------------
     *  |               |               |               |
     * 员工(王六)   员工(王七)      员工(王八)      员工(王九)
     * 
     */
        //总经理(张三)
        EmployeeInfo baseinfo = new EmployeeInfo("张三","001",EmployeeInfo.POWER.PRESIDENT);
        Manager president = new Manager(baseinfo);
    
        //经理(李四)
        baseinfo = new EmployeeInfo("李四","002",EmployeeInfo.POWER.MANAGER);
        Manager manager_1 = new Manager(baseinfo);
    
        //经理(王五)
        baseinfo = new EmployeeInfo("王五","003",EmployeeInfo.POWER.MANAGER);
        Manager manager_2 = new Manager(baseinfo);
    
        //员工(王六)
        baseinfo = new EmployeeInfo("王六","004",EmployeeInfo.POWER.NORMAL);
        NormalEMP emp_1 = new NormalEMP(baseinfo);
    
        //员工(王七)
        baseinfo = new EmployeeInfo("王七","005",EmployeeInfo.POWER.NORMAL);
        NormalEMP emp_2 = new NormalEMP(baseinfo);
    
        //员工(王八)
        baseinfo = new EmployeeInfo("王八","006",EmployeeInfo.POWER.NORMAL);
        NormalEMP emp_3 = new NormalEMP(baseinfo);
    
        //员工(王九)
        baseinfo = new EmployeeInfo("王六","007",EmployeeInfo.POWER.NORMAL);
        NormalEMP emp_4 = new NormalEMP(baseinfo);
    
        president.addStaff(manager_1);
        president.addStaff(manager_2);
        manager_1.addStaff(emp_1);
        manager_1.addStaff(emp_2);
        manager_2.addStaff(emp_3);
        manager_2.addStaff(emp_4);
    
        //总经理给经理发工资
        president.doSalaryForStaff(manager_1, 300, 10);
    
        //总经理给员工发奖金
        president.doSalaryForStaff(emp_1, 0, 1000);
    
        //经理给员工发奖金
        manager_1.doSalaryForStaff(emp_2, 10000, 100);
    
        //经理(王五)给(王七)发工资
        manager_2.doSalaryForStaff(emp_2, 10000, 100);
    
        //经理(李四)给(王五)发工资
        manager_1.doSalaryForStaff(manager_2, 10000, 100);
    
        //经理(李四)给(李四)发工资
        manager_1.doSalaryForStaff(manager_1, 10000, 100);
    
        //emp_1,emp_2,emp_3,emp_4是普通员工,无法发工资。
    }
    

    }
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛