2013-06-20 35 views
2

我这里有方法根据给定的参数用户添加到数据库中,(用户名,密码等)从通过不同类别实现一个共同的接口的Java

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

我不知道我怎么能做到这一点,使得两个类可以实现相同的接口,因为它们需要不同的参数。

任何想法?

+0

创建'User'和传递,或者使用方法重载。 –

回答

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) { 
     // ... 
    } 
} 
+0

这似乎很好,但我不能让用户实现AdminDAO的所有方法,例如ban和unban用户。用户只能添加自己(注册)。 – user2297666

+0

然后,您可以在这里做的是将常用方法分解到不同的接口中,比如说IUser,并让您的AdminDAO接口扩展它,而无需重复相同的方法声明。现在用户只会实现IUser,DAO会实现扩展的AdminDAO。 –

+0

好主意,非常感谢! – user2297666

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

无法实现与多个不同签名的接口方法。现在

,我已经得到了出路,让我澄清。一个接口包含方法签名。您不能通过更改方法签名来实现该接口,因为这会从根本上改变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); 
} 

然后你可以在你的不同的类中实现它。

+0

我的回答很好地恭维你。 –

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 
    } 

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

0

简短的回答你不能。 这是我最喜欢的GoF Design Patterns书籍中的几段。下面的文本应该清除你的任何查询。您可能需要阅读它几次。

由对象中声明的每个操作规定操作的名字, 它需要作为参数的对象,操作的回报 价值。被称为操作的signature.The组由对象的定义的所有 签名操作被称为对象的接口 。对象的接口表征可以发送给对象的整套 请求。任何相匹配的对象的接口一个 签名请求可以被发送到的对象。

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

接口是在面向对象的系统的基础。对象是 只有通过他们的interfaces.There知道没有办法知道一个对象的任何事情 或者要求它做任何事情,而无需通过其 接口去。一个对象的接口没有说明它的实现 - 不同的对象可以自由地以不同的方式实现请求 。

相关问题