上面这条用继承和多态关系写
时间: 2024-10-14 14:09:16 浏览: 7
当然,我们可以使用继承(Inheritance)和多态(Polymorphism)的概念来组织这个咖啡店程序。首先,我们创建一个基础类`CoffeDrink`,然后让具体的咖啡种类(如`WhiteCoffee`, `Latte`, `CoconutLatte`)作为它的子类。同时,我们使用接口或抽象类`Cup`和`Ingredient`来管理杯子和原料,这样可以在需要时轻松添加新的杯子类型和原料。
以下是使用继承和多态的一个简化版的Java代码示例:
```java
abstract class Drink {
abstract void prepare(Cup cup, Ingredient... ingredients);
}
interface Cup {
double getPrice();
}
class PaperCup implements Cup {
@Override
public double getPrice() {
return 2.0;
}
}
class PlasticCup implements Cup {
@Override
public double getPrice() {
return 1.5;
}
}
interface Ingredient {
double getPrice();
}
class Espresso extends Ingredient {
@Override
public double getPrice() {
return 3.0;
}
}
class Milk extends Ingredient {
@Override
public double getPrice() {
return 1.0;
}
}
class CoconutMilk extends Ingredient {
@Override
public double getPrice() {
return 1.5;
}
}
class MilkFroth extends Ingredient {
@Override
public double getPrice() {
return 0.5;
}
}
class Coffee extends Drink {
private final String name;
private Cup cup;
private Ingredient[] ingredients;
public Coffee(String name) {
this.name = name;
}
@Override
public void prepare(Cup cup, Ingredient... ingredients) {
this.cup = cup;
this.ingredients = ingredients;
double totalPrice = cup.getPrice();
for (Ingredient i : ingredients) {
totalPrice += i.getPrice();
}
System.out.printf("%s Used%n", this.name);
for (Ingredient ingredient : ingredients) {
System.out.println(ingredient.getName() + " Added");
}
System.out.printf("%s is ready: %s, total price: %.2f CNY%n",
this.name, cup.getPriceStr(), totalPrice);
}
private String getPriceStr() {
return cup.getClass().getSimpleName() + "+" + getIngredientsStr();
}
private String getIngredientsStr() {
StringBuilder sb = new StringBuilder();
for (Ingredient i : ingredients) {
sb.append(i.getName()).append("+");
}
return sb.substring(0, sb.length() - 1); // 移除最后一个加号
}
}
public class CoffeeShop {
public static void main(String[] args) {
Coffee latte = new Coffee("Latte");
latte.prepare(new PlasticCup(), new Espresso(), new Milk(), new MilkFroth());
}
}
```
在这个例子中,`Drink`是基类,`Coffee`继承自它,并实现了`prepare`方法。`Cup`和`Ingredient`是接口,`PaperCup`和`PlasticCup`以及`Espresso`, `Milk`, `CoconutMilk`, 和 `MilkFroth`是它们的具体实现。通过这种方式,我们可以很容易地添加新的咖啡种类和杯子类型,同时保持代码的整洁和扩展性。
阅读全文