如何避免代码重复维护信息隐藏槽多态性

How to avoid code duplication maintaining information hiding trough polymorphism

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

价格:

public abstract class Price {


    public abstract double getAmount(int rentalDays);

    public abstract  int getPriceCode();

}

正常价格:

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 转化为 getPriceCode() 方法的代码重复。 我考虑过将该方法提升到超类,但后来我无法声明 _priceCode 私有。

标准溶液是什么?

这里有几个选项:

1) 删除 "private" 关键字,使其成为 "package" 级别的访问权限。

2) 添加一个 getter and/or setter 到超类以提供您想要的访问类型。

也许你可以试试这个方法。

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;
    }

}
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;
  }
}

我看不出 getPriceCode() 必须保留在派生 class 中的任何原因,因为它是所有子 class 的共同行为,所以把它放在基础class。所以 _priceCodePrice 中并且没有分配,它应该声明为 protectedpackage (取决于你是否想要允许仅从同一包中的子classes 或即使从属于另一个包的子classes 自由访问它。

价格

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; }

}

正常价格

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 的子class可见,来自代码的其他部分只能使用 getter 方法访问并且 getPriceCode() 不会重复。