【发布时间】:2017-06-17 18:35:15
【问题描述】:
给定一个抽象类
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
}
}
}
但这不是我想要的。我想看看使用方法重载的解决方案。
【问题讨论】:
-
你在声明它们时忘记了
class这个词。 -
在 Java 中,重载方法是在编译时而不是运行时选择的,所以调用者有一些
Food但不知道它是什么类型(例如,它已被传递到它)永远无法调用consume的正确重载。 Java 类型系统不适合您正在尝试做的事情。 -
在大约 2 分钟的时间内获得 5 个答案。
-
“我希望看到一个使用方法重载的解决方案”...对不起,你不会看到,不是在 Java 中。在运行时决定执行哪个方法称为 polymorphism,正如this site 明确指出的那样,“多态适用于覆盖,而不适用于重载”——这与 David 所说的重载方法相同在编译时选择,而不是在运行时选择。
-
为什么需要通过继承实现不同类型的胃?泛型还不足以支持这种情况吗?
标签: java inheritance abstract-class abstract