私は読むこの質問そして、次のように書けば簡単に解決できるだろう(それがなくても解決できないというわけではない)と考えました。
@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
は破られます。
それは理にかなっていますか?