确定基于对象类型调用哪个方法

时间:2014-07-14 09:38:01

标签: java

好的,我有一个基础课程,我可以称之为 BaseEntity 。 所有其他实体类都继承此形式,例如:

A extends BaseEntity { ... }

B extends BaseEntitay {
    private A myA;
}

如您所见,一个实体可以与另一个实体建立关系。 事实上,有一个层次,像D有C有B有A ...

问题: 我想创建一个类,它将调用不同基类类型的对象上的方法。 我们的想法是建立一个像这样的公共方法:

public BaseClass getLowerLayer(BaseClass entity) {
    return getLowerLayer(entity);
}

然后在同一个班级中所有需要的方法:

public B getLowerLayer(C entit) {
    return someFancyMethod(entity); // this is defined elsewhere to get the right entity. I can not modify it.
}

但是这不起作用,因为它创建了一个无限循环。 有没有办法以微创方式创建这样的东西(没有instanceof )?

1 个答案:

答案 0 :(得分:2)

我想我知道你的意思。如果我没有错误,那就是多态性的完美例子。

你将基类扩展到子类的事实使你想知道超类如何知道这些子类是扩展他的那个?我有一个简单的解决方案。我不善于彻底解释,但我会举一个例子:

public abstract class AbstractDAO<T extends Serializable> {

    protected EntityManager em;
    protected Class<?> entityClass;

    public AbstractDAO(EntityManager em, Class<?> c) {
        this.em = em;
        this.entityClass = c;
    }

    @SuppressWarnings("unchecked")
    public T findById(Serializable id) {
        if (id == null) {
            throw new PersistenceException("id cannot be null");
        }
        return (T) em.find(entityClass, id);
    }

}

public class CustomerDAO extends AbstractDAO<Customer> {

    public CustomerDAO(EntityManager em) {
        super(em, Customer.class);
    }
}

public class OrderDAO extends AbstractDAO<Order> {

    public OrderDAO(EntityManager em) {
        super(em, Order.class);
    }
}

现在您可以看到我已将我的抽象类扩展到我的子类并使用泛型标记让超类知道他所属的子类。

EntityManager em = PersistenceManager.getEntityManager();
CustomerDAO customDAO = new CustomerDAO(em);
customDAO.findById(45325L);

“PersistenceManager”假定为我创建的自定义类。