2

このコードは私のものではなく、いくつかの改善を加える必要がありますが、この問題で立ち往生しています。

抽象クラス「CallNode」と多くのサブクラスがあり、そのうちの 1 つは「Call」です。「Checker」クラスは不在着信をインターセプトしますが、CallNode として返します。私の問題は、この呼び出しの ID を取得する必要があることですが、CallNode でアクセスできません。

この問題を解決するための提案はありますか?

問題をよりよく理解できるように、コードを示します。

public abstract class CallNode {
    public abstract CallNode hasMissingCall();
}

public class Call extends CallNode {
    public int id;

    // Simplification of method
    public CallNode hasMissingCall() {  
        if (true)
            return this;
        // ...
    }
}

public class Checker{
    private static CallNode rootExpected;

    CallNode missing = rootExpected.hasMissingCall();

    System.out.println( missing.id ); // THE PROBLEM!!!
}

前もって感謝します!!!

4

4 に答える 4

3

抽象クラスのIDを返すテンプレートメソッドを定義します。

public abstract class CallNode {
    public abstract CallNode hasMissingCall();

    public abstract int getId();
}

サブクラスに実装させます。

public class Call extends CallNode {
    public int id;

    // Simplification of method
    public CallNode hasMissingCall() {  
        if (true)
            return this;
        // ...
    }
    public int getId()
    {
         return this.id;
    }
}

それはオプションです。個人的には、CallNodeクラスのidフィールドを上に移動します。これは、idフィールドが一意であり、すべてのサブクラスで共有されることになっているためです。

于 2012-10-13T17:31:17.640 に答える
2

あなたがする必要がありnever directly access your fieldsます。

一般に、fieldsを宣言privateする必要があり、public accessorそれらにアクセスするためのメソッドが必要です。

クラスを変更できる場合は、クラスとクラスgetId()の両方にメソッドを追加します。そして Call クラスでは、このメソッドにあなたの. これはあなたのために仕事をします。abstract CallNodeCallthis.id

したがって、このメソッドをCallクラスに追加します: -

public int getId() {
    return this.id;
}

このメソッドをクラスに入れましょabstractAbstract

public abstract class CallNode {
    public abstract CallNode hasMissingCall();
    public abstract int getId();
}

そして、次を使用して呼び出します: -

missing.getId();

これにより、クラスの が呼び出されgetId()ます。Call

このコードは私のものではなく、いくつかの改善を加える必要があります。

PS: -本当に追加する必要がある改善の 1 つは、 を に変更するhasMissingCallことgetMissingCallですmissed call。常にnaming conventionsコードに従ってください。
覚えておいてください、あなたは自分のためにコードを書くのではなく、他の人が使用して維持するためにコードを書きます。

于 2012-10-13T17:26:07.970 に答える
1

次のようにキャストできますCall

System.out.println( ((Call) missing).id );

それは、他のクラスを変更できない場合missingで、 が のインスタンスになることがわかっている場合ですCall

于 2012-10-13T17:26:30.613 に答える
0

CallNode で抽象メソッド getId() を指定し、子に実装できます。次に、Checker でアクセスします。

public abstract class CallNode {
    public abstract CallNode hasMissingCall();
    public abstract int getId();
}

public class Checker{
    private static CallNode rootExpected;

    CallNode missing = rootExpected.hasMissingCall();

    System.out.println( missing.getId() );
}

public class Call extends CallNode {
    public int id; // better set private modifier
    public int getId() {
        return id;
    }
    ...
}
于 2012-10-13T17:34:20.660 に答える