首页 > 解决方案 > 当参数是给定类型的子类时如何调用重载方法?

问题描述

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

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

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

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

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

实现这种方法调用的最佳选择是哪些?而且这样的代码设计好不好?

标签: javainheritancemethodspolymorphismoverloading

解决方案


使用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);
    

推荐阅读