gpt4 book ai didi

java - 当参数是给定类型的子类时如何调用重载方法?

转载 作者:行者123 更新时间:2023-12-01 18:00:45 25 4
gpt4 key购买 nike

我有一个抽象类 A、两个名为 BC 的子类以及两个位于单独类中的重载方法:

public void process(B objB) {...}
public void process(C objC) {...}

从存储库中,我检索一个类型为 A 的实体,并且我想进行如下调用:

A objA = repo.findById(id);
process(objA);

我知道需要进行强制转换,但我不想使用 instanceof 或大量 if 语句进行大量检查。

实现此类方法调用的最佳选项是什么?那么这样的代码设计好吗?

最佳答案

使用 instanceof 并不是一个好的选择,尤其是当您有很多地方需要访问特定子类时。

  1. 显而易见的方法是将不带参数的抽象process()方法添加到基类中,并通过从另一个类调用相应的process(this)方法在子类中实现它类并将 this 引用传递给它。

  2. 当首选从类层次结构中划分处理逻辑时(大概是您的情况),有一对模式:Strategy或更一般的Visitor 。以下是访客模式使用示例:

    abstract class A {
    <T> T accept(Visitor<T> visitor);
    }

    class B extends A {
    @Override
    public <T> T accept(Visitor<T> visitor) {
    return visitor.visit(this);
    }
    }

    class C extends A {
    @Override
    public <T> T accept(Visitor<T> visitor) {
    return visitor.visit(this);
    }
    }

    interface Visitor<T> {
    T visit(B bObject);
    T visit(C cObject);
    }

    然后通过实现相应的访问者来定义特定的操作:

    Visitor<Integer> visitor = new Visitor<Integer>() {
    @Override
    public Integer visit(B bObject) {
    // TODO do something with bObject
    return null;
    }

    @Override
    public Integer visit(C cObject) {
    // TODO do something with cObject
    return null;
    }
    };

    然后调用接受:

    A objA = repo.findById(id);
    Integer result = objA.accept(visitor);

关于java - 当参数是给定类型的子类时如何调用重载方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60636524/

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