Java 如何使用组合而不是继承?
所以我有两个类,它们具有继承关系。专员员工和BASEPLUS专员员工。第三类持有主要方法。我所要做的就是将这两个类切换为使用组合而不是继承 因此,我首先删除Java 如何使用组合而不是继承?,java,Java,所以我有两个类,它们具有继承关系。专员员工和BASEPLUS专员员工。第三类持有主要方法。我所要做的就是将这两个类切换为使用组合而不是继承 因此,我首先删除extends CommissionEmployee并添加private CommissionEmployee comEmp字段之后,现在在同一个类中,我得到一个错误 @Override public double earnings() {return getBaseSalary() + super.earnings();} 该错
extends CommissionEmployee
并添加private CommissionEmployee comEmp字段代码>之后,现在在同一个类中,我得到一个错误
@Override
public double earnings() {return getBaseSalary() + super.earnings();}
该错误显示在earnings()
的两个实例下面,并表示类型为BasePlusCommissionEmployee的方法earnings()必须重写或实现一个超类型方法
我不确定为什么会这样做,但我通过将super.earnings()更改为comEmp.earnings()并删除@override来修复它
在构造函数的同一类中发现下一个错误
super(firstName, lastName, socialSecurityNumber,
grossSales, commissionRate);
错误是构造函数对象(String,String,String,double,double)未定义
现在我知道super
处理继承,因为我使用的是组合,所以不需要它,但是删除它会导致它自己的问题。为了让作文顺利进行,我应该在这门课上修改或删除什么
public class CommissionEmployee {
private final String firstName;
private final String lastName;
private final String socialSecurityNumber;
private double grossSales; // gross weekly sales
private double commissionRate; // commission percentage
// five-argument constructor
public CommissionEmployee(String firstName, String lastName,
String socialSecurityNumber, double grossSales,
double commissionRate) {
// implicit call to Object constructor occurs here
// if grossSales is invalid throw exception
if (grossSales < 0.0) {
throw new IllegalArgumentException("Gross sales must be >= 0.0");
}
// if commissionRate is invalid throw exception
if (commissionRate <= 0.0 || commissionRate >= 1.0) {
throw new IllegalArgumentException(
"Commission rate must be > 0.0 and < 1.0");
}
this.firstName = firstName;
this.lastName = lastName;
this.socialSecurityNumber = socialSecurityNumber;
this.grossSales = grossSales;
this.commissionRate = commissionRate;
}
// return first name
public String getFirstName() {return firstName;}
// return last name
public String getLastName() {return lastName;}
// return social security number
public String getSocialSecurityNumber() {return socialSecurityNumber;}
// set gross sales amount
public void setGrossSales(double grossSales) {
if (grossSales < 0.0) {
throw new IllegalArgumentException("Gross sales must be >= 0.0");
}
this.grossSales = grossSales;
}
// return gross sales amount
public double getGrossSales() {return grossSales;}
// set commission rate
public void setCommissionRate(double commissionRate) {
if (commissionRate <= 0.0 || commissionRate >= 1.0) {
throw new IllegalArgumentException(
"Commission rate must be > 0.0 and < 1.0");
}
this.commissionRate = commissionRate;
}
// return commission rate
public double getCommissionRate() {return commissionRate;}
// calculate earnings
public double earnings() {
return getCommissionRate() * getGrossSales();
}
// return String representation of CommissionEmployee object
@Override
public String toString() {
return String.format("%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f",
"commission employee", getFirstName(), getLastName(),
"social security number", getSocialSecurityNumber(),
"gross sales", getGrossSales(),
"commission rate", getCommissionRate());
}
}
那篇作文毫无意义。为什么底薪应该有员工?不应该是另一种方式吗?我想你想要的是类员工{PersonInfo PersonInfo;SalesInfo SalesInfo;CommissionScheme CommissionScheme}
如果让人困惑,我道歉,但我有明确的指示,只将BasePlusCommissionEmployee
类更改为使用组合而不是继承我不会将这些指示称为“明确”。要求澄清他们的意思。那篇作文毫无意义。为什么底薪应该有员工?不应该是另一种方式吗?我想你想要的是类员工{PersonInfo PersonInfo;SalesInfo SalesInfo;CommissionScheme CommissionScheme}
如果让人困惑,我道歉,但我有明确的指示,只将BasePlusCommissionEmployee
类更改为使用组合而不是继承我不会将这些指示称为“明确”。要求澄清他们的意思。
public class BasePlusCommissionEmployee extends CommissionEmployee {
private double baseSalary; // base salary per week
// six-argument constructor
public BasePlusCommissionEmployee(String firstName, String lastName,
String socialSecurityNumber, double grossSales,
double commissionRate, double baseSalary) {
super(firstName, lastName, socialSecurityNumber,
grossSales, commissionRate);
// if baseSalary is invalid throw exception
if (baseSalary < 0.0) {
throw new IllegalArgumentException("Base salary must be >= 0.0");
}
this.baseSalary = baseSalary;
}
// set base salary
public void setBaseSalary(double baseSalary) {
if (baseSalary < 0.0) {
throw new IllegalArgumentException("Base salary must be >= 0.0");
}
this.baseSalary = baseSalary;
}
// return base salary
public double getBaseSalary() {return baseSalary;}
// calculate earnings
@Override
public double earnings() {return getBaseSalary() + super.earnings();}
// return String representation of BasePlusCommissionEmployee
@Override
public String toString() {
return String.format("%s %s%n%s: %.2f", "base-salaried",
super.toString(), "base salary", getBaseSalary());
}
}
public class BasePlusCommissionEmployeeTest {
public static void main(String[] args) {
// instantiate BasePlusCommissionEmployee object
BasePlusCommissionEmployee employee =
new BasePlusCommissionEmployee(
"Bob", "Lewis", "333-33-3333", 5000, .04, 300);
// get base-salaried commission employee data
System.out.println(
"Employee information obtained by get methods:%n");
System.out.printf("%s %s%n", "First name is",
employee.getFirstName());
System.out.printf("%s %s%n", "Last name is",
employee.getLastName());
System.out.printf("%s %s%n", "Social security number is",
employee.getSocialSecurityNumber());
System.out.printf("%s %.2f%n", "Gross sales is",
employee.getGrossSales());
System.out.printf("%s %.2f%n", "Commission rate is",
employee.getCommissionRate());
System.out.printf("%s %.2f%n", "Base salary is",
employee.getBaseSalary());
employee.setBaseSalary(1000);
System.out.printf("%n%s:%n%n%s%n",
"Updated employee information obtained by toString",
employee.toString());
}
}