Я прочитал этот вопрос и подумал, что это было бы легко решить (не то чтобы это было невозможно без него), если бы можно было написать:
@Override public String toString() { returnsuper.super.toString(); }
Я не уверен, что это полезно во многих случаях, но мне интересно, почему это не так и существует ли что-то подобное в других языках.
Что вы, ребята, думаете?
РЕДАКТИРОВАТЬ: Для уточнения: да, я знаю, что это невозможно в Java, и я действительно не скучаю по этому. Я не ожидал, что это сработает, и был удивлен, получив ошибку компилятора. Мне просто пришла в голову идея, и я хотел бы ее обсудить.
Переведено автоматически
Ответ 1
Это нарушает инкапсуляцию. Вы не должны иметь возможности обойти поведение родительского класса. Иногда имеет смысл иметь возможность обойти поведение вашего собственного класса (особенно из того же метода), но не родительского. Например, предположим, что у нас есть базовая "коллекция элементов", подкласс, представляющий "коллекцию красных элементов", и подкласс, представляющий "коллекцию больших красных элементов". Имеет смысл иметь:
Это нормально - RedItems всегда может быть уверен, что все элементы, которые он содержит, красные. Теперь предположим, что мы смогли вызвать super.super.add():
publicclassNaughtyItemsextendsRedItems { @Override publicvoidadd(Item item) { // I don't care if it's red or not. Take that, RedItems! super.super.add(item); } }
Теперь мы можем добавлять все, что захотим, и инвариант в RedItems нарушен.
Имеет ли это смысл?
Ответ 2
Я думаю, что у Джона Скита есть правильный ответ. Я просто хотел бы добавить, что вы можете получить доступ к затененным переменным из суперклассов superclasses путем приведения this:
У меня недостаточно репутации, чтобы комментировать, поэтому я добавлю это к другим ответам.
Джон Скит отвечает превосходно, приводя прекрасный пример. Мэтт Би прав: не у всех суперклассов есть суперклассы. Ваш код сломался бы, если бы вы вызвали super из super, у которого не было super.
Объектно-ориентированное программирование (которым является Java) - это все об объектах, а не о функциях. Если вы хотите программировать, ориентируясь на задачи, выберите C ++ или что-то еще. Если ваш объект не вписывается в свой суперкласс, то вам нужно добавить его в "прародительский класс", создать новый класс или найти другой super, в который он вписывается.
Лично я считаю это ограничение одной из самых сильных сторон Java. Код несколько жесткий по сравнению с другими языками, которые я использовал, но я всегда знаю, чего ожидать. Это помогает с "простой и знакомой" целью Java. На мой взгляд, вызов super.super не является простым или знакомым. Возможно, разработчики чувствовали то же самое?