我必须使用 instanceof 还是有任何多态解决方案?

Do I have to use instanceof or is there any polymorphic solution?

我的任务是创建一个简单的约会 superclass,包含三个(每日、一次性、每月)subclasses

然后我需要要求用户输入不同的约会并通过名为 add 的方法将它们存储在 ArrayList 中。用户也应该 select 预约的类型。

我是多态的新手,尝试找到多态解决方案而不是使用 instanceof 运算符。

我的情况可以吗?

你能帮我更好地理解 polymorphism 吗?

您可以从此处的 Java 教程开始:https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

您根本不需要 instanceof 运算符。预约 class 并每次(每日、一次性、每月)延长预约,以便他们可以使用它的变量和方法。

示例:

public Daily extends Appointment

从那里您应该能够制作一个主 class 来测试您制作的内容并将值存储在 ArrayList 中。例如:

List<Appointment> arrayList = new ArrayList<Appointment>();
arrayList.add("supply subclass object that you've created here");

继续添加,直到所有子class都已添加到您的约会数组列表中。希望这有帮助。

如果你只需要 store/add 一个 ArrayList 中的所有子类型,那么你可以选择类型参数('<' 和 '>' 中的 Class 类型)作为超级class即Appointment。所以你可以做 List<Appointment> apps = new ArrayList<Appointment>();

现在您可以按如下方式存储所有子类型:-

apps.add(new Daily()); apps.add(new OneTime()); apps.add(new Monthly());

如果你想从这个 ArrayList 中获取任何对象,你也可以将它分配到父类型的引用变量中,即 Appointment as Appointment a = apps.get(0);

最后,如果您想在此 a 变量上调用任何重写方法 它会通过 Polymorphism.

的 属性 自动调用实际子类型的覆盖方法

此外,如果您想在某个地方专门检查 Appointment 参考变量的 class,您可以使用 getClass() 方法并将其与子类进行比较。所以我不确定你为什么要在什么地方使用 instanceof。希望这可以稍微清除您的疑问。

实际上,如果使用 接口 会更好。 接口指定契约(即 class 应该是什么以及它应该能够做什么),并有助于避免相关问题 继承例如对 superclass 方法的依赖。 并且仍然让您继承其他 classes。 总体而言 - 界面更加灵活。

我会编码:

public Daily implements Appointment

然后就像 @unsensibled 提到的那样:

List<Appointment> arrayList = new ArrayList<>();
Appointment daily = new Daily();
arrayList.add(daily);