通过不同的Java类实现通用接口

时间:2013-06-20 14:48:07

标签: java database object interface

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

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...

我不知道如何才能这样做,以便两个类都可以实现相同的接口,因为它们需要不同的参数。

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

您无法使用多个不同的签名实现接口方法。

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

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

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

然后,您可以让您的界面接受User个对象。

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

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

答案 1 :(得分:2)

更改您的管理员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) {
        // ...
    }
}

答案 2 :(得分:0)

将参数包装在界面中。

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

然后让你的Admin_DAO接受IUsers。

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

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

答案 3 :(得分: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
    }

每个班级实际上应该有一个目的。

答案 4 :(得分:0)

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

  

对象声明的每个操作都指定操作的名称,   作为参数的对象,以及操作的返回   value。这被称为操作的签名。所有这一切   由对象的操作定义的签名称为接口   对象。对象的界面表征完整的一组   可以发送到对象的请求。任何与a匹配的请求   对象界面中的签名可以发送给对象。

     

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

     

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