java面向对象自动贩卖机程序包含多个子类多态接口继承投币支付和扫码分为微信和支付宝支付异常库存不足货架位置
时间: 2024-02-09 13:09:16 浏览: 24
好的,下面是一个更新后的Java面向对象自动贩卖机程序,它包含多个子类、多态、接口、继承、投币支付和扫码支付,并分为微信和支付宝支付,异常处理包括库存不足和货架位置错误。
首先,我们可以定义一个Drink类作为所有饮料的父类,其中包含以下属性:
- name:一个String类型的变量,表示饮料名称。
- price:一个double类型的变量,表示饮料价格。
- count:一个int类型的变量,表示饮料库存。
- shelf:一个String类型的变量,表示饮料所在货架位置。
然后,我们可以定义多个子类,分别代表不同的饮料种类,例如Coke、Sprite和MineralWater。这些子类继承自Drink类,并实现Drink提供的接口。
接口可以定义自动贩卖机的基本功能,例如showDrinks()、insertCoin(double coin)和buy(int index)。这些功能可以被VendingMachine类和Drink类的子类实现,以实现代码的复用和扩展。
投币支付和扫码支付可以通过继承自insertCoin()方法,并在其中增加支付的逻辑实现。我们可以定义一个Payment接口,然后让微信支付和支付宝支付分别实现这个接口。
库存不足的异常处理可以在buy()方法中进行,如果饮料库存不足,则抛出一个StockNotEnoughException异常。货架位置错误的异常处理可以在buyByCode()方法中进行,如果货架位置错误,则抛出一个ShelfErrorException异常。
下面是一个简单的示例代码:
```java
public interface IVendingMachine {
void showDrinks();
void insertCoin(double coin);
void buy(int index) throws StockNotEnoughException, ShelfErrorException;
}
public interface Payment {
void pay(double amount);
}
public class VendingMachine implements IVendingMachine {
private Drink[] drinks;
private double balance;
public VendingMachine(Drink[] drinks) {
this.drinks = drinks;
this.balance = 0;
}
@Override
public void showDrinks() {
System.out.println("饮料种类\t价格\t库存\t货架位置");
for (int i = 0; i < drinks.length; i++) {
System.out.println((i + 1) + ". " + drinks[i].getName() + "\t" + drinks[i].getPrice() + "\t" + drinks[i].getCount() + "\t" + drinks[i].getShelf());
}
}
@Override
public void insertCoin(double coin) {
this.balance += coin;
System.out.println("当前余额:" + this.balance);
}
@Override
public void buy(int index) throws StockNotEnoughException, ShelfErrorException {
Drink drink = drinks[index - 1];
if (drink.getCount() == 0) {
throw new StockNotEnoughException(drink.getName() + "已售罄");
}
if (!drink.getShelf().equals("A1")) {
throw new ShelfErrorException(drink.getName() + "不在A1货架");
}
if (balance >= drink.getPrice()) {
System.out.println("购买成功," + drink.getName() + ",找零:" + (balance - drink.getPrice()));
balance -= drink.getPrice();
drink.setCount(drink.getCount() - 1);
} else {
System.out.println("余额不足,请继续投币");
}
}
public void buyByCode(String code) throws StockNotEnoughException, ShelfErrorException, CodeErrorException {
int index = code.charAt(code.length() - 1) - '0';
if (index < 1 || index > drinks.length) {
throw new CodeErrorException("二维码错误");
}
buy(index);
}
public void payByWechat(double amount) {
System.out.println("微信支付:" + amount);
}
public void payByAlipay(double amount) {
System.out.println("支付宝支付:" + amount);
}
}
public class Drink {
private String name;
private double price;
private int count;
private String shelf;
public Drink(String name, double price, int count, String shelf) {
this.name = name;
this.price = price;
this.count = count;
this.shelf = shelf;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getShelf() {
return shelf;
}
}
public class Coke extends Drink {
public Coke(int count, String shelf) {
super("可乐", 3.0, count, shelf);
}
}
public class Sprite extends Drink {
public Sprite(int count, String shelf) {
super("雪碧", 2.5, count, shelf);
}
}
public class MineralWater extends Drink {
public MineralWater(int count, String shelf) {
super("矿泉水", 1.5, count, shelf);
}
}
public class StockNotEnoughException extends Exception {
public StockNotEnoughException(String message) {
super(message);
}
}
public class ShelfErrorException extends Exception {
public ShelfErrorException(String message) {
super(message);
}
}
public class CodeErrorException extends Exception {
public CodeErrorException(String message) {
super(message);
}
}
public class WechatPayment implements Payment {
@Override
public void pay(double amount) {
System.out.println("微信支付:" + amount);
}
}
public class AlipayPayment implements Payment {
@Override
public void pay(double amount) {
System.out.println("支付宝支付:" + amount);
}
}
```
在这个示例代码中,我们定义了一个IVendingMachine接口,它包含了所有自动贩卖机的基本功能。然后,我们让VendingMachine类实现了这个接口,以便实现自动贩卖机的功能。同时,Drink类和它的子类也实现了这个接口,以便在需要时扩展自动贩卖机的功能。
投币支付和扫码支付可以通过继承自insertCoin()方法,并在其中增加支付的逻辑实现。我们可以定义一个Payment接口,然后让微信支付和支付宝支付分别实现这个接口。
在buy()方法中,我们进行了库存不足和货架位置错误的异常处理。如果饮料库存不足,则抛出一个StockNotEnoughException异常。如果饮料不在A1货架位置,则