我有根据给定的参数(用户名,密码等等)将用户添加到数据库的方法
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 :(得分: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”的接口中定义的操作。一个对象可能 有很多种类,而且广泛不同的对象可以共享一个类型。部分 对象的界面可以用一种类型和另一种来表征 其他类型的零件。相同类型的两个对象只需要共享 他们的接口的一部分。接口可以包含其他接口 子集。我们说类型是另一个类型的子类型,如果它的接口 包含其超类型的接口。我们经常谈到一个子类型 继承其超类型的接口。
接口是面向对象系统的基础。对象是 只通过他们的接口知道。没有办法知道任何事情 关于一个物体或要求它做任何事情而不经过它 接口。对象的界面对它没有任何说明 实现 - 不同的对象可以自由地实现请求 不同。