繁体   English   中英

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

[英]How to call overloaded method when the parameter is a subclass of a given type?

我有一个抽象类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);

如果不首先强制转换对象,则无法在此实例中使用重载方法,因为如果显式对象类型不匹配,程序将不会调用重载方法。 所以它不会调用 process(B objB) 除非你传递的对象是 B 类。

为了避免太麻烦,有几种方法可以做到。 根据 B 和 C 之间的区别,您可以在从数据库中提取对象时将 A 实例化为该类型(这可以在 RowMapper 中完成)并编写 if else 语句以确定要调用哪个进程:

        if(a.getClass() == B.class)
        {
            return process((B) a);
        }
        else
        {
            return process((C) a);
        }

或者,如果您有更多子类,则可以使用 switch 语句。 这是我能想到的最简单的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM