给定一个抽象类
public abstract class AbstractStomach {
public abstract void consume(Food food);
}
我希望有一些具体的类,这些类拥有不同的重载方法:
public class FruitStomach extends AbstractStomach {
public static class Apple extends Food {}
public static class Orange extends Food {}
@Override
public void consume(Apple food) {...}
@Override
public void consume(Orange food) {...}
}
public class MeatStomach extends AbstractStomach {
public static class Beef extends Food {}
@Override
public void consume(Beef food) {...}
}
上述方法不能有效实现我的需求,因为它要求在每个具体类中也实现一般的 consume(Food) 抽象方法。但我不希望具体类实现 consume(Food),因为这已经被它们重载的变量所覆盖了。实际上,每个具体类只应该消耗特定种类的食物,而不是任何一种食物。
AbstractStomach stomach = new FruitStomach();
stomach.consume(new Beef());
应该会出现一个错误。
如果我在抽象类中删除了抽象方法,那么它们扩展抽象类就没有意义了,因为它们不知道要实现什么。
如何修复上述设计,使得每个具体类都可以有其重载方法,但是它们知道必须实现一个抽象方法consume()
,而不需要实现consume(Food)
。
编辑
我可以解决上述问题而不使用重载,例如:
public class FruitStomach extends AbstractStomach {
public static class Apple extends Food {}
public static class Orange extends Food {}
@Override
public void consume(Food food) {
if (food instanceof Apple) {
...
} else if (food instanceof Orange) {
...
} else {
// throws an error
}
}
}
但这不是我想要的。我希望看到一个使用方法重载的解决方案。
consume
重载方法。Java类型系统并不适合您所尝试的操作。 - David Conrad