【问题标题】:Multiple Inheritance in Java - Spring DataJava中的多重继承 - Spring Data
【发布时间】:2014-05-28 07:24:05
【问题描述】:

我想创建一个名为 BaseDAO 的 DAO 类,它应该具有 Spring 中的 JPA 和 JDBC 功能。我的意思是,我想将 spring 的 JPADAOSupport 和 JDBCDAOSupport 类扩展到我的 BaseDAO 类中。我知道多重继承在 Java 中不是一个选项。

我创建了两个独立的 Base 类,例如 BaseJPADao 和 BaseJdbcDao 扩展各自的类。是否可以有一个类来扩展两者?有没有解决这个问题的设计模式。请指教。

【问题讨论】:

  • 如果您向我们展示 JPADAOSupport 和 JDBCDAOSupport 的定义以及您想要的子类中的内容,我们可以为您提供帮助。您提供的信息很少
  • @TheLostMind:您好,请将我的评论提交给 Vlad Mihalcea。提供更多信息...
  • 是什么阻止您在这两个类中注入两个依赖项?

标签: java spring jpa design-patterns spring-data


【解决方案1】:

为什么没有注入实际 JPA DAO 和 JDBC DAO bean 的 DaoGateway bean。

然后,此网关可以决定将给定请求委托给哪个 DAO(委托给 JPA 或委托给 JDBC)。

You should always favour composition vs inheritance 重用功能时。

【讨论】:

  • 感谢您的评论。我确实在春天用过注射豆子。但我想做的是......我有 BusinessDAO 将使用 JPATemplate 功能,而 SimpleDAO 将使用 JDBCTemplate 功能。我还有一个 BaseDAO,其中有一些其他方法,需要由 BusinessDAO 和 SimpleDAO 实现/使用。我的想法是,我们可以在 BaseDAO 中扩展 JPADaoSupport 和 JdbcDaoSuport,然后其他 dao 类可以扩展 BaseDao。希望你有我的问题。
  • 您不能同时扩展 JPADaoSupport 和 JdbcDaoSuport,因为 Java 不允许多类继承。 BaseDao 可以将 JPADaoSupport 和 JdbcDaoSuport 定义为 proeprties,当您覆盖该类时,您可以获得任何您想要的。
【解决方案2】:

不,不是。如果可能的话,你仍然会得到与 一个扩展 JPADAOSupport 和 JDBCDAOSupport 的类,你自己说你知道这是不可能的,因为多重继承是不可能的。

不过,您可以写入一个接口,并提供两个实现。

【讨论】:

  • “你可以写入一个接口,并提供两种实现。” - 并在两个接口中实现方法?这意味着 myClass 既是 JPADAOSupport 又是 JDBCDAOSupport 。从设计的角度来看这是错误的。 OP也可以在不实现接口的情况下实现所有方法。接口对代码的可重用性没有帮助。
  • 我说过了吗?但是:InterfaceType obj = new Implementation1();不工作? obj = new Implementation2();实际上,这使得两者都可能不是在一个类中,而是在一个变量中。
  • 至于从设计的角度来说对与错,那是一个意见。您要求我们回答您的问题,并且您有很多优惠。
【解决方案3】:

如果它们都具有您想要的接口级别访问权限,那么通过委派很容易做到这一点:

public class MyUberClass implements WhateverJPADAOSupportDoes, WhateverJDBCDAOSupportDoes {
    private JPADAOSuport jpa;
    private JDBCDAOSupport jdbc;

    // now implement all methods specified by the interfaces on the class signature and delegate to their respective member
}

但您似乎想要访问他们所有的公共方法。由于两者都没有接口,您可以与上述相同的操作,但不能同时具有两种类型。语言明确否认你这一点。

您唯一的其他选择是创建一个您的代码可以依赖的适配器接口,然后使用组合委托。如果你希望有一门课程可以代替两者,那么答案是你不能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2015-11-11
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多