2013-06-20 71 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知道沒有辦法知道一個對象的任何事情 或者要求它做任何事情,而無需通過其 接口去。一個對象的接口沒有說明它的實現 - 不同的對象可以自由地以不同的方式實現請求 。

相關問題