除了继承
,实现通过同样的功能,我们可以使用组合
。
组合
是在子类中声明一个对父类的引用。
通过组合实现和继承一样的功能:
核心代码:
image.png image.png
<TestPhoneV1.java>
package day09;
public class TestPhoneV1 {
public static void main(String[] args) {
MerchandiseWithConstructor merchandise = new MerchandiseWithConstructor(1,"小米9",100,3999,3599);
PhoneV1 v1 = new PhoneV1(6.0,3.5,8.0,128.0,"小米", "安卓", merchandise);
v1.describe();
}
}
<PhoneV1.java>
package day09;
public class PhoneV1 {
private double screenSize;
private double cpuHZ;
private double memoryG;
private double storageG;
private String brand;
private String os;
private MerchandiseWithConstructor merchandise;
public PhoneV1(double screenSize, double cpuHZ, double memoryG, double storageG, String brand, String os, MerchandiseWithConstructor merchandise) {
this.screenSize = screenSize;
this.cpuHZ = cpuHZ;
this.memoryG = memoryG;
this.storageG = storageG;
this.brand = brand;
this.os = os;
this.merchandise = merchandise;
}
public void describe() {
System.out.println("当前商品的名字是:" + this.merchandise.getName() + " 库存个数是:" + this.merchandise.getCount() + " 进价是:" + this.merchandise.getPurchasingRrice() + "元 " + "售价是:" + this.merchandise.getSoldPrice() + "元 " + "销售一个的毛利润是: " + (this.merchandise.getSoldPrice() - this.merchandise.getPurchasingRrice()));
System.out.println("手机配置信息如下:\n屏幕大小:" + this.screenSize + "英寸 \nCPU主频:" + this.cpuHZ + "GHz \n内存大小:" + this.memoryG + "G \n存储空间:" + storageG + "G \n品牌:" + this.brand + " \n操作系统:" + os);
}
public double getScreenSize() {
return screenSize;
}
public void setScreenSize(double screenSize) {
this.screenSize = screenSize;
}
public double getCpuHZ() {
return cpuHZ;
}
public void setCpuHZ(double cpuHZ) {
this.cpuHZ = cpuHZ;
}
public double getMemoryG() {
return memoryG;
}
public void setMemoryG(double memoryG) {
this.memoryG = memoryG;
}
public double getStorageG() {
return storageG;
}
public void setStorageG(double storageG) {
this.storageG = storageG;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
public MerchandiseWithConstructor getMerchandise() {
return merchandise;
}
public void setMerchandise(MerchandiseWithConstructor merchandise) {
this.merchandise = merchandise;
}
}
继承和组合的关系:XX是YY的一种,还会组合了YY,"手机是到底手电筒的一种,还是组合了可以当手电筒的闪光灯"
如果对于一个需求,需要控制手机(也是一种商品)的数量购买限制,那么怎么实现呢?
二、使用组合
缺点:
- 修改Merchandise类会限制所有商品的购买数量
- 极有可能你无法修改Merchandise类
- 手机提供一个buyCount的方法,别人可以不调用,或者使用Merchandise类中的方法修改库存。
鉴于此,继承就可以发挥其作用了。
网友评论