sav person.haml_spec.rb | call delete(expand('#'))
Вы не можете вызывать супер-метод в других объектах - это нарушит инкапсуляцию. Все дело в том, что объект контролирует то, что делают его переопределенные методы. Например, вы можете переопределить метод коллекции add
, чтобы генерировать исключение при определенных обстоятельствах, чтобы гарантировать, что в коллекцию будут добавлены только «действительные» элементы. Это было бы бессмысленно, если бы вызывающие абоненты могли просто обойти его с помощью преобразования!
Единственная причина, по которой объект может вызывать super.foo ()
для себя, - это возможность реализовать один вызов с использованием родительского элемента реализация. Это' s до кода в классе, чтобы убедиться, что он только когда-либо делает это разумно. Опять же, возьмем пример надстройки коллекции: если коллекция переопределяет добавить
, у нее должен быть какой-то способ добавления проверенного элемента в коллекцию, что выполните с super.add ()
.
Обратите внимание, что по той же причине инкапусляции вы можете только вызывать родительскую реализацию, а не реализацию прародителя, поэтому super .foo ()
является допустимым, а super.super.foo ()
- нет.
1:
Ваш вопрос не совсем Чисто. Что вы имеете в виду под «вызовом во время выполнения, как код»? Если вы спрашиваете, как экземпляр c знает, что это за суперкласс, тогда да, иерархия классов хранится в памяти и может быть доступна виртуальной машине.
2:
Java действительно позволяет вам преобразовать экземпляр своему родителю. Просто вызов метода в экземпляре всегда использует фактический класс экземпляра, а не его класс времени компиляции. Т.е. в Java все методы являются так называемыми виртуальными в C ++.