gpt4 book ai didi

java - 动态类型的调用方法

转载 作者:搜寻专家 更新时间:2023-11-01 02:22:05 24 4
gpt4 key购买 nike

我有一个看起来有点像这样的类层次结构:

class Parent { }
class Child1 extends Parent {}
class Child2 extends Parent {}
class Child3 extends Parent {}

在另一个类中,我有如下所示的方法:

void doSomething(Parent p) { //default }
void doSomething(Child1 c) { //implementation for Child 1 }
void doSomething(Child2 c) { //implementation for Child 2 }

目前,当我有这样的事情时

Parent p = new Child2();
doSomething(p);

第一个方法 doSomething(Parent) 被调用而不是 doSomething(Child2)

假设我有一个静态类型为 Parent 和动态类型为 ChildN 的项目列表。我如何确保为动态类型提供的方法被调用,而不进行强制转换。仅针对 Child3(没有特定的 doSomething 方法)我想调用默认实现。

最佳答案

您正在寻找的是所谓的“多分派(dispatch)”或“动态分派(dispatch)”——在 Java 中不存在。

在 Java 中,编译器决定在重载 的情况下选择哪个方法。 (这就是当您拥有三个名称相同但参数类型不同的方法时会发生的情况)。这发生在编译时,如果您的“运行时”Parent 对象恰好是 Child1 对象;那没关系。因为编译器固定要调用的方法 - 如前所述:java 不支持动态调度。

从这个意义上讲,正确的 Java 解决方案是在您的父类上放置一个方法“doSomething()”;并让每个 child 覆盖该方法到特定的东西。

如果“doSomething()”并不真正“适合”这个类;你可以看看 visitor pattern .另一种选择是使用 instanceof ... 但是您应该“隐藏”相应的 if/else 链 ... 再次使用多态性,例如:

interface DoIt { void doSomething() }
class ParentDoIt implements DoIt ...
same for Childs

class DoItFactory {
DoIt getDoIt(Parent p) {
if (p instanceof Child1) return new Child1DoIt(p)
...

关于java - 动态类型的调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37875485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com