子类中没有构造函数的DbRepository实现

时间:2014-10-07 00:46:17

标签: java design-patterns repository-pattern

我得到了以下物品:

public class DbRepository<T> implements DbRepositoryInterface<T>{
  protected T model;

  protected DbRepository(T model) {
    System.out.println("DbRepository created.");
    this.model = model;
  }

  @Override
  public T getModel() {
    return model;
  }
}

public interface DbRepositoryInterface<T> {
  public T getModel();
}

public class PlayerDbRepository extends DbRepository<Player> {
}

在我的代码中,我想要使用我想要调用的PlayerDbRepository

DbRepositoryInterface<Player> repo = new PlayerDbRepository();

但在PlayerDbRepository中,我收到有关父类DbRepository中的构造函数的警告。我需要修改什么来使其工作?或者我的方法是错误的吗?

2 个答案:

答案 0 :(得分:0)

DbRepository类有一个需要T的构造函数。由于您的PlayerDbRepository子类为DbRepository,因此您必须使用T实例调用父构造函数。

你可以这两种方式:

  1. 在子类中创建一个类似的构造函数,它接受一个Player并将其委托给父构造函数:

    public class PlayerDbRepository extends DbRepository<Player> {
    
       public PlayerDbRepository(Player model){
           super(model);
       }
    }
    
  2. 以其他方式创建一个Player实例并在

    中传递它
    public class PlayerDbRepository extends DbRepository<Player> {
    
       public PlayerDbRepository(){
           super(new Player());
       }
    }
    
  3. 当然,您始终可以将两种解决方案结合使用,以便代码的用户可以选择最适合他们的选项。

     public class PlayerDbRepository extends DbRepository<Player> {
           /**
           * Creates new Repository with default Player.
           */
           public PlayerDbRepository(){
               super(new Player());
           }
    
           /**
           * Creates new Repository with given Player.
           */
           public PlayerDbRepository(Player model){
               super(model);
           }
        }
    

答案 1 :(得分:-1)

DbRepositoryInterface是界面。

您无法创建界面对象。

您可以做的一件事是实现Factory类,将您的接口映射到您的存储库类。通常我们使用工具来做到这一点。

您的实例化将如下所示: DbRepositoryInterface repo = FactoryClass.GetInstanceOf(); 反过来,无论如何,你将返回PlayerDbRepository对象。

谢谢,