1. ホーム
  2. java

[解決済み] なぜJavaではsuper.super.method();が許されないのですか?

2022-03-24 21:24:22

質問

読む この質問 と書くことができれば、簡単に解決する(しなくても解決しないわけではない)のではないかと思いました。

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

多くの場合、役に立つかどうかは分かりませんが、どうでしょうか。 何故 他の言語にはないのでしょうか?

皆さんはどう思われますか?

EDITです。 はっきり言うと、そうなんです、Javaでは不可能なことで、それを見逃すことはないんです。これは私がうまくいくと思っていたことではなく、コンパイラーエラーが出たことに驚いているのです。私はちょうどアイデアを持っていたし、それを議論するのが好きです。

どのように解決するのですか?

カプセル化に違反している。親クラスの振る舞いを迂回することはできないはずです。を迂回できることがあるのは理にかなっています。 自分の クラスの動作は (特に同じメソッド内で) 制御できますが、親の動作は制御できません。例えば、ベースとなる "collection of items" があり、そのサブクラスが "a collection of red items" を表し、そのサブクラスが "a collection of big red items" を表しているとする。持つことに意味があるのです。

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 が壊れている。

これって意味があるんでしょうか?