问题:为什么Java不允许super.super.method();
我想出了这个问题,认为这个是很好解决的(也不是没有它就不行的)如果可以像下面那样写的话:
@Override
public String toString() {return super.super.toString();
}
我不确定这在很多情况下是否有用,但是我想知道为什么这个是不存在并且其他语言里面有没有这种东西
你们是怎么看的
遍及:澄清一下,我知道了这在Java里面是不允许的,我也不是很想用它。它并不像我期望那样工作还出现了一个编译错误。我仅仅只是有这个想法并且想讨论一下
回答
它违背了封装。你不能绕过父类的行为。有时候绕过你自己的类的行为是行得通的,但是绕过父类就不行。例如,假设我们有一个基本的”物品集合”,一个子类“红色物品的集合”和一个子类“红色大物品的集合”。下面这样才有意义:
public class Items
{public void add(Item item) { ... }
}public class RedItems extends Items
{@Overridepublic void add(Item item){if (!item.isRed()){throw new NotRedItemException();}super.add(item);}
}public class BigRedItems extends RedItems
{@Overridepublic void add(Item item){if (!item.isBig()){throw new NotBigItemException();}super.add(item);}
}
这是很好的,RedItems总是可以确定它里面包含的东西全都是红色的。现在假如我们这样调用 super.super.add():
public class NaughtyItems extends RedItems
{@Overridepublic void add(Item item){// I don't care if it's red or not. Take that, RedItems!super.super.add(item);}
}
现在我们加啥都行了,RedItems的含义就被破坏了,也就失去意义了
文章翻译自Stack Overflow:https://stackoverflow.com/questions/586363/why-is-super-super-method-not-allowed-in-java