Из примечаний к выпуску Xcode 3 beta 3:
«статические» методы и свойства теперь разрешены в классах (в качестве псевдонима для «final final»).
blockquote>Итак, в Swift 1.2
hi()
, определенном какclass foo { static func hi() { println("hi") } }
, используется метод типа (т. е. метод, который вызывается самим типом), который также final (т.е. нельзя переопределить в подклассе).
x.proc(z)
выбирают из методов типа x
(то есть X
) во время компиляции. Единственный доступный метод - proc(X)
.
Также имейте в виду, что public void proc(Z p)
в Z
не отменяет public void proc(X p)
.
Вы получаете этот результат, потому что ваши proc
методы не перекрывают друг друга.
Самый простой способ увидеть это - добавить @Override
-аннотацию:
static class Z extends Y {
public Z() {
v += 9;
}
@Override
public void proc(Z p) {
System.out.println(34);
}
}
Это не удастся скомпилировать с сообщением об ошибке
Метод proc ( Test.Z) типа Test.Z должен переопределить или реализовать метод супертипа
blockquote>Рекомендуется добавлять эту аннотацию всякий раз, когда вы собираетесь переопределить метод - таким образом компилятор может проверить, Вы действительно делаете.
Чтобы исправить ошибку и переопределить метод для получения ожидаемого результата, вы можете изменить тип параметра на
X
:static class Z extends Y { public Z() { v += 9; } @Override public void proc(X p) { System.out.println(34); } }
Теперь он снова компилируется и выдает
34
.
В вашем примере произошло то, что вместо переопределения ваш класс
Z
добавил перегруженный методvoid proc(Z p)
в дополнение к к методуvoid proc(X p)
изX
. Разрешение перегрузки основано на типе времени компиляции, поэтому только метод изX
доступен и выбирается. Этот метод переопределен вY
, так что это то, что фактически выполняется во время выполнения.Следовательно, другой способ получить ожидаемый результат - оставить
X
,Y
иZ
без изменений и изменить тип ссылкиx
наZ
:[ 1131] Эта версия вызывает перегруженный метод изpublic static void main(String[] args) { Z x = new Z(); Y y = new Z(); Z z = new Z(); x.proc(z);//// 1 System.out.println(y.getV()); }
Z
, потому что это наиболее специфическая перегрузка для параметра типаZ
.