Das verstößt gegen die Verkapselung. Man sollte nicht in der Lage sein, das Verhalten der übergeordneten Klasse zu umgehen. Manchmal ist es sinnvoll, das Verhalten der eigenen Klasse zu umgehen. eigene Verhalten der Klasse (insbesondere innerhalb derselben Methode), nicht aber das der Elternklasse. Nehmen wir zum Beispiel an, wir haben eine Basisklasse "Sammlung von Gegenständen", eine Unterklasse, die "eine Sammlung von roten Gegenständen" darstellt und eine Unterklasse davon, die "eine Sammlung von großen roten Gegenständen" darstellt. Es macht Sinn, zu haben:
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);
}
}
Das ist in Ordnung - RedItems kann sich immer darauf verlassen, dass die darin enthaltenen Elemente alle rot sind. Nehmen wir nun an, wir waren in der Lage, super.super.add() aufzurufen:
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);
}
}
Jetzt können wir hinzufügen, was wir wollen, und die Invariante in RedItems
gebrochen ist.
Ergibt das einen Sinn?