Java может назвать родительский переопределенный метод в других объектах, но не подтипе?

sav person.haml_spec.rb | call delete(expand('#'))
36
задан Dov Vachman 2 July 2019 в 17:24
поделиться

2 ответа

Вы не можете вызывать супер-метод в других объектах - это нарушит инкапсуляцию. Все дело в том, что объект контролирует то, что делают его переопределенные методы. Например, вы можете переопределить метод коллекции add , чтобы генерировать исключение при определенных обстоятельствах, чтобы гарантировать, что в коллекцию будут добавлены только «действительные» элементы. Это было бы бессмысленно, если бы вызывающие абоненты могли просто обойти его с помощью преобразования!

Единственная причина, по которой объект может вызывать super.foo () для себя, - это возможность реализовать один вызов с использованием родительского элемента реализация. Это' s до кода в классе, чтобы убедиться, что он только когда-либо делает это разумно. Опять же, возьмем пример надстройки коллекции: если коллекция переопределяет добавить , у нее должен быть какой-то способ добавления проверенного элемента в коллекцию, что выполните с super.add () .

Обратите внимание, что по той же причине инкапусляции вы можете только вызывать родительскую реализацию, а не реализацию прародителя, поэтому super .foo () является допустимым, а super.super.foo () - нет.

69
ответ дан 27 November 2019 в 05:47
поделиться

1:

Ваш вопрос не совсем Чисто. Что вы имеете в виду под «вызовом во время выполнения, как код»? Если вы спрашиваете, как экземпляр c знает, что это за суперкласс, тогда да, иерархия классов хранится в памяти и может быть доступна виртуальной машине.

2:

Java действительно позволяет вам преобразовать экземпляр своему родителю. Просто вызов метода в экземпляре всегда использует фактический класс экземпляра, а не его класс времени компиляции. Т.е. в Java все методы являются так называемыми виртуальными в C ++.

1
ответ дан 27 November 2019 в 05:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: