如何避免代码重复维护信息隐藏槽多态性
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。所以 _priceCode
在 Price
中并且没有分配,它应该声明为 protected 或 package (取决于你是否想要允许仅从同一包中的子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()
不会重复。
我写了下面两个类(实现状态模式):
价格:
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。所以 _priceCode
在 Price
中并且没有分配,它应该声明为 protected 或 package (取决于你是否想要允许仅从同一包中的子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()
不会重复。