Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用组合而不是继承?_Java - Fatal编程技术网

Java 如何使用组合而不是继承?

Java 如何使用组合而不是继承?,java,Java,所以我有两个类,它们具有继承关系。专员员工和BASEPLUS专员员工。第三类持有主要方法。我所要做的就是将这两个类切换为使用组合而不是继承 因此,我首先删除extends CommissionEmployee并添加private CommissionEmployee comEmp字段之后,现在在同一个类中,我得到一个错误 @Override public double earnings() {return getBaseSalary() + super.earnings();} 该错

所以我有两个类,它们具有继承关系。专员员工和BASEPLUS专员员工。第三类持有主要方法。我所要做的就是将这两个类切换为使用组合而不是继承

因此,我首先删除
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());
   } 
}