我编写了以下两个类(实现状态模式):
价格:
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
私有。
标准解决方案是什么?
答案 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; }
}
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;
}
}