2010-06-18 80 views
1

我正在Google App Engine上編寫一個項目,其中包含許多抽象類,我希望我可以在將來的項目中使用這些類,以及一些從它們繼承的具體類。 在其他抽象類中,我有一個抽象的servlet來進行用戶管理,而且我有一個抽象用戶。 AbstractUser具有將其存儲在數據存儲中並告訴用戶是否註冊了我的服務的所有必要字段和方法。它沒有實現任何項目特定的功能。管理用戶的抽象servlet只涉及AbstractUser類中聲明的方法,它允許它生成登錄,註銷和註冊(對於未註冊的用戶)的鏈接。 爲了實現項目特定的用戶功能,我需要繼承Abstract用戶。我在我的項目中使用的servlet都是來自抽象用戶管理servlet的間接後代,並且用戶是其中的受保護字段,所以後代servlet可以將其用作自己的字段。但是,無論何時我想訪問具體用戶的任何項目特定方法,我都需要將其轉換爲該類型。 即從子類(Java)設置超類中字段的類型

(abstract user managing servlet) 
... 
AbstractUser user = getUser(); 
... 
abstract protected AbstractUser getUser(); 


(project-specific abstract servlet) 
@Override 
protected AbstractUser getUser() { 
    return MyUserFactory.getUser(); 
} 

任何其他項目特定的servlet:

int a = ((ConcreteUser) user).getA(); 

嗯,我想要做的就是以某種方式使超類中的「用戶」的類型是什麼取決於該項目的東西特定的抽象類。這是否可能?

而且我不想把所有的用戶管理的東西到一個特定的項目層,我想有它我已經寫了未來項目:)

謝謝您的幫助。

回答

3

讓您AbstractServlet通用:

public class AbstractServlet<T extends AbstractUser> { 
    private T user; 
    protected abstract T getUser(); 
    ... 

然後你就可以在實現使用的AbstractUser一個特定的子類:

public class ConcreteServlet extends AbstractServlet<ConcreteUser> { ... 

然後,你將不再需要轉換,如您有任何地方T在基類中,您的實現將參照ConcreteUser

@Override 
protected abstract ConcreteUser getUser() { .. } 
+0

非常感謝,它的工作完美。 – Ibolit 2010-06-18 12:00:14

0

我想你需要的是通用類:

class AbstractUserManager<UserType extends AbstractUser> { 
    protected UserType user;  

    public UserType getUser() { 
     return user; 
    } 

    public void addUser(UserType u) { 
     this.user = u; 
    } 

    ...some other methods that use AbstractUser and dont need specific functionality... 
} 

//Class used for managing AbstractUsers with no extra features 
class SimpleUserManager extends AbstractUserManager<AbstractUser> { 
//No body as AbstractUserManager is enough 
} 

//Class that manages CrazyUsers 
class CrazyUserManager extends AbstractUserManager<CrazyUser> { 
    public CrazyUserManager() { 
     this.setUser(new CrazyUser()); 
    } 

    public someNewFunction() { 
     this.getUser().someCrazyActionOnlyCrazyUsersHave(); 
    } 
}