2010-06-18 76 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(); 
    } 
}