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

あなたのコードは、あなたがやろうとしていることに対して非常に不器用に思えます。次のようにしてみませんか。

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 に答える