Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过不同的Java类实现公共接口_Java_Database_Object_Interface - Fatal编程技术网

通过不同的Java类实现公共接口

通过不同的Java类实现公共接口,java,database,object,interface,Java,Database,Object,Interface,我在这里有一种方法,可以根据给定的参数(用户名、密码等)将用户添加到数据库中 这里有一个用于将User对象添加到ArrayList public boolean addUser(User username) { if(users.contains(username)) //do stuff... 但是,我试图通过一个公共接口实现这两种情况: public interface Admin_DAO { public void addUser(); //ot

我在这里有一种方法,可以根据给定的参数(用户名、密码等)将用户添加到数据库中

这里有一个用于将
User
对象添加到
ArrayList

public boolean addUser(User username)
{
    if(users.contains(username))
        //do stuff...
但是,我试图通过一个公共接口实现这两种情况:

public interface Admin_DAO {

    public void addUser();
    //other methods...
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
    }
考虑到两个类需要不同的参数,我不确定如何才能实现相同的接口


有什么想法吗?

将参数包装到接口中

public interface IUser{
    String getName();
    String getPassword();
    //etc
}
public interface AdminDAO {
    public boolean addUser(User user);
}
然后让你的管理员接受IUsers

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

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

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

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

public interface IUser{
    String getName();
    String getPassword();
    //etc
}
public interface AdminDAO {
    public boolean addUser(User user);
}
如果您的方法需要完全不同的信息,它们可能不应该实现相同的接口。但是,如果它们需要基本相同的信息,但格式不同,那么您应该编写一个接口,该接口接受该信息的通用格式,然后它们都可以实现它。例如,如果一个
用户
看起来基本上是这样的:

public User(String username, String password, String f_name, String l_name, String email) {
}
然后,您可以使界面接受
用户
对象

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

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

更改管理DAO以接受用户数据对象,以适应将来对需要传递的参数数量所做的任何更改,而不影响公共接口

public interface IUser{
    String getName();
    String getPassword();
    //etc
}
public interface AdminDAO {
    public boolean addUser(User user);
}
然后在用户DAO中将此方法作为重载实现。我还建议您以
char[]
的形式存储或传递密码,以防止实习(添加到Java字符串池中)

编辑:(根据OP下面的评论扩展接口)


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

interface Admin_DAO{

public void addUser(User user);

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

public interface Admin_DAO {

    public void addUser();
    //other methods...
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
    }

每门课实际上应该有一个目的。简短的回答你不能。 以下是GoF设计模式书中我最喜欢的几段。下面的文本将清除您的任何查询。你可能想读几遍

对象声明的每个操作都指定该操作的名称, 它作为参数的对象,以及操作的返回 值。这称为操作的签名。所有 由对象操作定义的签名称为接口 对该对象。一个对象的接口描述了一套完整的 可以发送到对象的请求。任何符合 对象接口中的签名可以发送给对象

类型是用于表示特定接口的名称。我们说的是一个 对象,如果它接受对 在名为“Window”的接口中定义的操作。对象可以 具有许多类型,并且不同的对象可以共享一个类型。部分 对象接口的类型可以由一种类型和另一种类型表示 被其他类型分割。相同类型的两个对象只需共享 它们的部分接口。接口可以包含其他接口,如 子集。我们说一个类型是另一个类型的子类型,如果它的接口 包含其超类型的接口。我们经常谈论一个亚型 继承其超类型的接口

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


创建一个
用户
并将其传入。或者使用方法重载。我的回答很好地恭维了你的回答。这似乎很有效,但我不能让用户实现AdminDAO的所有方法,例如ban和unban。用户应该只能添加他自己(register)。然后,您可以在这里将常用方法分解到不同的接口中,比如说IUser,并让您的AdminDAO接口扩展它,而无需重复相同的方法声明。现在用户将只实现IUser,DAO将实现扩展的AdminDAO。