从父抽象类调用getter方法

时间:2011-12-12 14:48:51

标签: java inheritance struts abstract-class

这就是我的课程的样子:

public abstract class BaseForm extends Z{
    protected String someString;

    public String getSomeString(){
        return this.someString;
    }

    public void setSomeString(String some){
        this.someString = some;
    }
}

public abstract class AdvancedForm extends BaseForm{
    protected Something selectedThing;
    protected List<Something> listOfThings;

    public Something getSelectedThing(){
        return this.selectedThing;
    }

    public void setSelectedThing(Something thing){
        this.selectedThing = thing;
    }    

    public List<Something> getListOfThings(){
        return this.listOfThings;
    }

    public void setListOfThings(List<Something> list){
        this.listOfThings = list;
    }
}

public class FinalForm extends AdvancedForm{
    //Lot of stuff done here
}

所以我有类似于你上面看到的东西。当我创建JSP并尝试调用get/setListOfThings方法时,问题就来了。

<html:html>
    ...
    <html:select name="FinalForm" property="selectedThing">
        <html:optionsCollection name="FinalForm" property="listOfThings" label="label" value="value" />
    </html:select>
    ...
</html:html>

我知道我在这里遗漏了一些东西(struts-config.xmltiles-def.xml存在并且是正确的),但我的观点是struts应该调用FinalForm'{{ 1}}方法。这应该调用setListOfThings的{​​{1}}方法(实现的方法),因为AdvancedForm正在扩展setListOfThings而我没有覆盖FinalForm中的方法{1}}。

无论如何,这不起作用,我不知道出了什么问题。唯一可行的方法是,如果我覆盖该方法并从AdvancedForm明确调用FinalForm

setListOfThings

我想避免重写,因为创建AdvancedForm类的目的是删除我的大多数表单正在使用的许多功能(但不是全部,这是存在的原因) public class FinalForm extends AdvancedForm{ //... public List<Something> getListOfThings(){ return super.getListOfThings(); } } AdvancedForm类。

为什么这不起作用的任何想法?有什么想法来改善这个吗?任何人都可以向我解释我做错了什么?提前谢谢!

3 个答案:

答案 0 :(得分:2)

你的功能肯定会很棒。但是如果你在struts json中渲染结果,它将不会获得超类属性。 如果是json,你必须按照以下方式定义你的struts.xml

<result type="json">
  <param name="ignoreHierarchy">false</param>
</result>

类似的讨论:How to include parent class fields in json response using struts 2 json plugin

答案 1 :(得分:0)

您需要在超类中使用方法public而不是protected,否则Struts类将无法看到它。

答案 2 :(得分:0)

它不起作用只是因为该方法受到保护。一旦你覆盖它,它就可以了,因为你将覆盖方法公之于众。

只需将基本方法公开,(几乎)一切都会好的。

提交表单后,应调用setSelectedThing方法。问题是Struts无法将请求中收到的String参数神奇地转换为Something实例。 selectedThing属性的getter和setter应使用String而不是Something