将传递参数设置为基类的可接受方法是什么?

时间:2013-07-09 09:31:33

标签: java oop

我希望将尽可能多的可重复代码移动到基类中,但我发现自己需要将派生类中的变量传递回基类。

myClass必须使用无参数初始化方法,并且通过myInterface.setup()进行“设置”。

如何强制myBase的扩展程序设置变量,而不必每次都从someBaseMethod()

检查它们是否已设置
interface myInterface
{
    void setup(String myStr);
    void someBaseMethod();
}

abstract class myBase implements myInterface
{
    String myStr = null;

    protected abstract String getMyStr();

    // called lots of times.
    public void someBaseMethod()
    {
        if (myStr == null) myStr = getMyStr();

        // ...
    }
}

class myClass extends myBase
{
    String s = null;

    public void setup(String myStr)
    {
        s = myStr;
    }

    protected String getMyStr()
    {
        return s;
    }
}

3 个答案:

答案 0 :(得分:1)

如果protected String getMyStr()在子类中实现并返回特定于实现的字符串,则不应将其作为字段String myStr保留在基类中。

只需创建一个局部变量:

public void someBaseMethod() {
    final String myStr = getMyStr();
    .....

另外,如果你需要在其他任何事情之前运行setup方法,那么你可能想要一个布尔标志,表示已经设置了字段。

答案 1 :(得分:0)

您可以在班级boolean中添加myBase变量,表示该班级已正确初始化。

E.g。

class MyBase {
    private initialized = false; // Only for documentation as a bolean is always initialied to false
    // further variables and methods
}

然后你只需要检查那个变量:

if (initialized) {
    // Do your stuff
} else {
    // Do some error handling
}

请注意,Java lasses通常以大写字母开头。

答案 2 :(得分:0)

您的代码对于您要执行的操作似乎非常笨拙。你为什么不这样做:

interface myInterface
{
    void setup(String myStr);
    void someBaseMethod();
}

abstract class myBase implements myInterface
{
    private String myStr = null;

    protected String getMyStr()
    {
        return myStr;
    }

    protected void setMyStr(String value)
    {
        myStr = value;
    }

    // called lots of times.
    public void someBaseMethod()
    {
        // do stuff with myStr
    }
}

class myClass extends myBase
{
    public void setup(String myStr)
    {
        setMyStr(myStr);
    }
}

或者我理解你的要求错了吗?