問題:為什么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