2

次の抽象クラスがあります

public abstract class ReturnAgentFromTab extends BasePage{

    @Persist("session")
    public abstract Agent getAgent();
    public abstract void setAgent(Agent agent);

    @InjectObject("spring:agentApplicationModeResolver")
    public abstract AgentApplicationModeResolver getAgentApplicationModeResolver();

    .... more @InjectObject()

    public void nextPage(IRequestCycle cycle) {

        setApplicationModeUsingAgentStatus(getAgent());

        AgentSearchNavigationManager navManager = getAgentSearchNavigationManagerFactory().getAgentSearchNavigationManager();
        FlowStage stage = getFlowStage();
        if (stage == null) {
            setApplicationModeUsingAgentStatus(getAgent());
            stage = getUserDefaultFlowStageService().getDefaultFlowStage(UserHolder.getUser(), getVisitClass().getApplicationMode());
        }

        Class nextPageClass = navManager.getNextPage(getUserDefaultFlowStageService());

        String nextPageQualifier = getUserDefaultFlowStageService().getPageQualifier(getAgent(), nextPageClass, getVisitClass().getApplicationMode());
        IPage nextPage = getPageUtils().getPage(nextPageClass, nextPageQualifier);
        if ((getFlowStage() instanceof PSDFlowStage)) {
            nextPageQualifier = getFlowStage().getValue();
        }
        nextPage = getPageUtils().getPage(nextPageClass, nextPageQualifier);
        if (navManager instanceof NameBasedAgentSearchNavigationManager && nextPageClass != SignOffStatusPage.class) {
            NameBasedAgentSearchNavigationManager nameBasedNavManager = (NameBasedAgentSearchNavigationManager) navManager;
            String nextPageName = nameBasedNavManager.getNextPageName(stage); 
            if (!nextPageName.equals(nextPageClass.getSimpleName())) {
                nextPage = getPageUtils().getPage(nextPageName, nextPageQualifier);
            }
        }

        if (isNextPageActivateAgentGeneral(nextPage)) {
            initialisePageLink(nextPageClass, nextPage);
        }
        ((WuamsBasePage) nextPage).init(getAgent().getAgentId());
        getPageUtils().navigateTo(nextPage);

    }

    private void setApplicationModeUsingAgentStatus(Agent agent) {
        getVisitClass().setApplicationMode(getHomeLinksFactory().getRegionHomeLinksService().getApplicationMode(agent));
    }

    private boolean isNextPageActivateAgentGeneral(IPage nextPage) {
        return nextPage instanceof ActiveAgentGeneralPage;
    }

    private void initialisePageLink(Class nextPageClass, IPage nextPage) {
        if (getVisitClass().getPageLink() == null) {
            getVisitClass().setPageLink(PageLinkUtil.getPageLinkMessageKeyFromPageClass(nextPageClass, 
                    getUserDefaultFlowStageService().getDefaultFlowStage(UserHolder.getUser(), getVisitClass().getApplicationMode()).getValue()));
        }
    }

}

私がやりたいのは、nextPage(cycle)抽象的で extends である別のクラスからmy を呼び出すことですReturnAgentFromTabが、試してみると

public abstract class DoSomethingWithAgent extends ReturnAgentFromTab {

@Persist("session")
public abstract ReturnAgentFromTab getReturnAgentFromTab();
public abstract void setReturnAgentFromTab(ReturnAgentFromTab returnAgentFromTab);
....
getReturnAgentFromTab().nextPage(cycle);

null ポインター例外が発生します。これは、実際には ReturnAgentFromTab をどこにも設定していないためですが、抽象クラスを使用して設定する方法がわかりません。誰でも助けることができますか?

さらにコードが必要な場合は、お問い合わせください

4

3 に答える 3

2

抽象クラスのポイントは、特定のオブジェクトを提供するなど、特定のものを単に実装しないことです。このメソッドgetReturnAgentFromTab()は完璧な例です。クラス自体は、そのオブジェクトがどこから来たのかを気にしません。これは、サブクラスの唯一の責任だからです。したがって、そのクラスを拡張し、そのメソッドを作成すると、突然、基本クラスがその役割を果たします。

于 2012-11-02T12:32:27.430 に答える
1

まあ、抽象クラスを初期化することはできません。唯一の方法は、他の具象クラスに抽象クラスを拡張させ、具象クラスのインスタンスで非抽象メソッドを呼び出すことです。

abstarct class ABS1 {
   //abstract methods
   //concreate method
   public void concMethod() {
      }
 }

public class ABS1Impl extends ABS1 {
 //implement all the abstract methods
 }
public abstract class ABS2 {
   ABS1 abs = new ABSImpl();
   abs.concMethod // 
}
于 2012-11-02T12:32:59.927 に答える
1

これは2つの理由からだと思います。

  1. getReturnAgentFromTab()返品する場合がありますnull。また
  2. の値はcycleですnull
于 2012-11-02T12:36:23.110 に答える