Java では super.super.method(); が許可されないのはなぜですか? 質問する

Java では super.super.method(); が許可されないのはなぜですか? 質問する

私は読むこの質問そして、次のように書けば簡単に解決できるだろう(それがなくても解決できないというわけではない)と考えました。

@Override
public String toString() {
    return super.super.toString();
}

多くの場合に便利かどうかはわかりませんが、なぜ便利ではないのか、他の言語にこのようなものが存在するのか疑問に思います。

皆さんはどう思いますか?

編集:明確にするために: はい、私は知っています、それは Java では不可能ですし、それが恋しいとも思いません。これは私が期待していた動作ではなく、コンパイラ エラーが発生して驚きました。私はただアイデアを思いついたので、それについて議論したいだけです。

ベストアンサー1

これはカプセル化に違反します。親クラスの動作をバイパスできないようにする必要があります。自分クラスの動作をバイパスできる場合 (特に同じメソッド内から) があっても、親のクラスの動作をバイパスできないのは理にかなっています。たとえば、基本の「アイテムのコレクション」、サブクラスが「赤いアイテムのコレクション」を表し、そのサブクラスが「大きな赤いアイテムのコレクション」を表すとします。次のようになります。

public class Items
{
    public void add(Item item) { ... }
}

public class RedItems extends Items
{
    @Override
    public void add(Item item)
    {
        if (!item.isRed())
        {
            throw new NotRedItemException();
        }
        super.add(item);
    }
}

public class BigRedItems extends RedItems
{
    @Override
    public void add(Item item)
    {
        if (!item.isBig())
        {
            throw new NotBigItemException();
        }
        super.add(item);
    }
}

それは問題ありません。RedItems は、含まれるアイテムがすべて赤色であることを常に確信できます。ここで、super.super.add() を呼び出すことができたとします。

public class NaughtyItems extends RedItems
{
    @Override
    public void add(Item item)
    {
        // I don't care if it's red or not. Take that, RedItems!
        super.super.add(item);
    }
}

これで、好きなものを追加できるようになりました。また、 の不変条件RedItemsは破られます。

それは理にかなっていますか?

おすすめ記事