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

问题描述是这样的:

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

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

我的问题是:

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

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

把代码切出来供大家讨论:
[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]

[code="java"]加我QQ503229799晚上给你讲思路[/code]

使用不同的包

给你发了一个文件你自己先看看,其中测试类自己先写吧。

逻辑有问题,你这三个类不要处理太多业务逻辑
通常做法,定义一个抽象类,三种类型继承抽象类,
发工资可以单独写一个类,根据级别定义业务逻辑,

切忌,不要让一个类成为万能的。。尽量做到模块化

能不能在另外弄一个抽象类,它和三种对象没有任何实际意义,只是三种对象共同点的抽象,然后分别定义每种对象能够进行的操作,或者另外弄一个工具类,如果是在一个项目中应该要弄一个权限管理吧。