如何避免代码重复通过多态保持信息隐藏

时间:2017-12-02 14:59:04

标签: java polymorphism state code-duplication information-hiding

我编写了以下两个类(实现状态模式):

价格:

public abstract class Price {


    public abstract double getAmount(int rentalDays);

    public abstract  int getPriceCode();

}

RegularPrice:

public class RegularPrice extends Price {

    private static final int _priceCode = 0;


    @Override
    public double getAmount(int rentalDays) {
        double res = 2;
        if (rentalDays > 2)
            res += (rentalDays - 2) * 1.5;
        return res;
    }

    @Override
    public int getPriceCode() {
        return _priceCode;
    }
}

问题是,使用不同的_priceCode添加Price的其他子类会转换为getPriceCode()方法的代码重复。 我想把这个方法提升到超类但是我无法宣布_priceCode私有。

标准解决方案是什么?

4 个答案:

答案 0 :(得分:1)

这里有几个选项:

1)删除"私人"关键字使其成为"包"等级访问。

2)在超类中添加一个getter和/或setter,以提供您想要的访问类型。

答案 1 :(得分:1)

我看不出为什么getPriceCode()必须留在派生类中的任何原因,因为它是所有子类的常见行为,所以把它作为基类。因此_priceCode位于Price且未分配,应将其声明为受保护(取决于您是否允许免费访问它仅来自同一包中的子类,或者甚至来自属于另一个包的子类)。

价格

public abstract class Price {
    protected static final int _priceCode;    // do you really need static?

    Price(int p){ this._priceCode=p;}
    public abstract double getAmount(int rentalDays);
    public int getPriceCode(){ return _priceCode; }

}

RegularPrice

public class RegularPrice extends Price {

     RegularPrice(int p){ 
         //many ways to do this, but use costructors to set members
         super(p); 
      } 

    public double getAmount(int rentalDays) {
        double res = 2;
        if (rentalDays > 2)
            res += (rentalDays - 2) * 1.5;
        return res;
    }

}

通过这种方式,_priceCode 直接只能从 Price 的子类中看到,从其他代码部分只能使用getter方法访问它getPriceCode()不重复。

答案 2 :(得分:-1)

也许你可以尝试这种方法。

public abstract class Price {
    protected final int _priceCode;

    public Price(int priceCode) {
        this._priceCode = priceCode;
    }

    public final int getPriceCode() {
        return this._priceCode;
    }

    public abstract double getAmount(int rentalDays);
}
public class RegularPrice extends Price {

    public RegularPrice() {
        super(0);  // put the default priceCode here, or use a private final static int PRICE_CODE = 0 to avoid magic number
    }

    @Override
    public double getAmount(int rentalDays) {
        double res = 2;
        if (rentalDays > 2)
            res += (rentalDays - 2) * 1.5;
        return res;
    }

}

答案 3 :(得分:-1)

public class Price {
   private int _priceCode;
   public double getAmount(int rentalDays);

   public int getPriceCode() {
    return _priceCode;
   }
}

在子类上执行此操作:

public class RegularPrice extends Price {

  private int _priceCode = 0;


  @Override
  public double getAmount(int rentalDays) {
    double res = 2;
    if (rentalDays > 2)
        res += (rentalDays - 2) * 1.5;
    return res;
  }

  @Override
  public void setPriceCode(int priceCode) {
    _priceCode = priceCode;
  }
}