0

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

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;
    }
}
4

3 回答 3

1

如果protected String getMyStr()在子类中实现并返回实现特定的字符串,那么您不应该将其作为 field 保存在基类中String myStr

只需创建一个局部变量:

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

此外,如果您需要先运行 setup 方法,那么您可能需要一个布尔标志,指示字段已设置。

于 2013-07-09T09:39:34.990 回答
0

您可以在您的类中添加一个boolean变量myBase,表明该类已正确初始化。

例如

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 中,通常以大写字母开头。

于 2013-07-09T09:38:44.290 回答
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);
    }
}

还是我理解错了你的要求?

于 2013-07-09T09:40:08.263 回答