2

我这里有根据给定参数(用户名、密码等)将用户添加到数据库的方法

public boolean addUser(String username, String password, 
    String f_name, String l_name, String email) 
{
    try 
    {
        pstmnt = conn.prepareStatement("INSERT INTO users VALUES (user_id_increment.nextval,?,?,?,?)");
        //do stuff...

还有一个在这里将User对象添加到ArrayList

public boolean addUser(User username)
{
    if(users.contains(username))
        //do stuff...

但是,我试图通过一个通用接口来实现这两种情况:

public interface Admin_DAO {

    public void addUser();
    //other methods...

我不确定如何做到这一点,以便两个类都可以实现相同的接口,因为它们需要不同的参数。

有任何想法吗?

4

5 回答 5

3

您不能实现具有多个不同签名的接口方法。

既然我已经解决了这个问题,让我澄清一下。接口包括方法签名。您不能通过更改方法签名来实现该接口,因为这从根本上改变了 Java 看待方法的方式。Java 认为具有不同签名的两种方法就像它们具有不同的名称一样不同。因此,您可以编写一个具有两种不同addUser方法的类,但其中只有一种会覆盖接口中的方法。

如果您的方法需要完全不同的信息,那么它们可能不应该实现相同的接口。但是,如果它们需要基本相同但格式不同的信息,那么您应该编写一个接受该信息的通用格式的接口,然后它们都可以实现它。例如,如果结果 aUser看起来基本上是这样的:

public User(String username, String password, String f_name, String l_name, String email) {
}

然后你可以让你的界面接受User对象。

public interface Admin_DAO {
    public void addUser(User u);
}

然后你可以根据需要在不同的类中实现它。

于 2013-06-20T14:53:31.093 回答
2

更改您的 Admin DAO 以接受用户数据对象,以适应未来对您需要传递的参数数量的任何更改,而不会影响公共接口。

public interface AdminDAO {
    public boolean addUser(User user);
}

然后将此方法实现为用户 DAO 中的重载。我还建议您存储或传递您的密码char[]以防止实习(添加到 Java 字符串池中)。

public class UserDAO implements AdminDAO {

    public boolean addUser(User user) {
        return addUser (user.getUsername(), user.getPassword(),
                        user.getFName(), user.getLName(), user.getEmail());
    }

    public boolean addUser( 
        String username, char[] password,
        String f_name, String l_name, String email) {
        // ...
    }
}

编辑:(扩展界面以响应以下OP的评论)

public interface IUser {
    public boolean addUser(User user);
}

public interface AdminDAO extends IUser {
    // other DAO methods
}

public class UserDAO implements AdminDAO {
    // ...
}

public class UserUtil implements IUser {

    public boolean addUser(User user) {
        return addUser (user.getUsername(), user.getPassword(),
                        user.getFName(), user.getLName(), user.getEmail());
    }

    public boolean addUser( 
        String username, char[] password,
        String f_name, String l_name, String email) {
        // ...
    }
}
于 2013-06-20T14:58:22.690 回答
0

将参数包装在接口中。

public interface IUser{
    String getName();
    String getPassword();
    //etc
}

然后让您的 Admin_DAO 接受 IUser。

public interface Admin_DAO{
    void addUser(IUser user);
    boolean contains(IUser user);
}

这允许抽象 Admin_DAO 实现细节。它可以是一个数据库,或者只是一个内存数据结构。让它接受包装在接口中的数据可以让您传入相同类型的对象。

于 2013-06-20T14:50:39.123 回答
0

理想情况下,应该有两个类。由于用于两种方法的信息是相同的。您的界面应如下所示:

interface Admin_DAO{

public void addUser(User user);

} 

你应该有两个单独的类来实现这个接口:

class AddUserToList implements Admin_DAO{
    public void addUser(User user){
      //add user to list
    }

class addUserToDB implements Admin_DAO{

   public void addUser(User user){
      //add user to list
    }

每个类实际上应该服务于一个目的。

于 2013-06-20T15:04:59.890 回答
0

简短的回答你不能。 以下是 GoF 设计模式书中我最喜欢的几段。下面的文字应该清除您的任何查询。你可能想读几遍。

对象声明的每个操作都指定操作的名称、作为参数的对象以及操作的返回值。这称为操作的签名。由对象的操作定义的所有签名的集合称为对象的接口。对象的接口表征了可以发送到对象的完整请求集。任何与对象接口中的签名匹配的请求都可以发送到对象。

类型是用于表示特定接口的名称。如果对象接受对名为“Window”的接口中定义的操作的所有请求,则我们称该对象具有“Window”类型。一个对象可能有多种类型,并且不同的对象可以共享一个类型。一个对象的接口的一部分可以由一种类型来表征,而其他部分则由其他类型来表征。相同类型的两个对象只需要共享它们的接口的一部分。接口可以包含其他接口作为子集。如果一个类型的接口包含其超类型的接口,我们就说它是另一个类型的子类型。我们经常说子类型继承其超类型的接口。

接口是面向对象系统的基础。对象只能通过它们的接口知道。没有办法知道关于对象的任何事情或要求它做任何事情而不通过它的接口。一个对象的接口没有说明它的实现——不同的对象可以自由地以不同的方式实现请求。

于 2013-06-20T15:12:14.983 回答