0

Javaでは、Level1クラス(次のサンプルコードを参照)が3つ以上のレベルで派生しないようにする必要があります。Level2とLevel3までの派生は問題ありませんが、クラスがLevel4によって派生されている場合は、例外がスローされます。次のコードサンプルを見てください。

コードサンプル:

class Level1 {
    private int level = 1;

    protected Level1() throws RuntimeException {
        level++;
        //System.out.println(level);
        if (level > 2) {
            throw new RuntimeException("Can't implement more than 2 levels");
        }
    }
}

class Level2 extends Level1 {
    protected Level2() {
    }
}

class Level3 extends Level2 {
    Level3() {
    }
}

class Level4 extends Level3 {
    Level4() {
    }
}

上記のコードサンプルから、静的intレベルカウンターを使用したソリューションを提案していません。私は問題を説明しようとしています。

Javaで、ロジックを実装するか、Level1基本クラスが派生したレベルの数をカウントできるAPIを使用することで可能ですか?

4

4 に答える 4

9

コンストラクターでリフレクションを使用し、this.getClass() の継承チェーンをたどって、ネスト レベルを確認できます。実際、 this.getClass().getSuperClass() == Level1.class のテストは、すでにトリックを行っているはずです。

于 2012-08-08T15:16:56.527 に答える
5

introspection api はそれを処理するのに役立ちます。次のようなものを試してください:

protected Level1() throws RuntimeException {
        if (getClass().equals(Level1.class)) {
            return;
        }

        if (getClass().getSuperclass().equals(Level1.class)) {
            return; // first level or inheritance
        }

        if (getClass().getSuperclass().getSuperclass().equals(Level1.class)) {
            return; // second level or inheritance
        }
        // else
        throw new RuntimeException("Can't implement more than 2 levels");
    }

ところで、なぜそれをしたいのですか?

于 2012-08-08T15:22:08.850 に答える
3

getClass().getSuperclass() などを見て、クラスのレベルが N 以下であることを確認できます。

しかし、それは不可解な要件です。:P

于 2012-08-08T15:17:41.050 に答える
0

level3クラスをfinalにすることができます。そうすると、どのクラスによっても拡張できなくなります。finalと宣言されたクラスは、サブクラス化できません。

于 2012-08-08T15:32:36.293 に答える