#java #inheritance
#java #наследование
Вопрос:
Рассмотрим следующие два класса:
public class Sup3r {
public void sup3rMethod() {}
}
public class Child extends Sup3r {
public void childMethod() {}
}
и следующие три утверждения:
s.sup3rMethod();
c.childMethod();
s.childMethod();
Последнее утверждение дает
Не удается разрешить метод ‘childMethod’ в ‘Sup3r’
Почему?
Комментарии:
1. Вероятно, потому
s
, что это aSup3r
, а не aChild
. Поскольку мы не можем видеть, где вы определилиs
, илиc
мы можем только строить предположения.2. Пожалуйста, покажите полный пример кода, включая создание
s
иc
.3. Потому что … полиморфизм. При
s.childMethod( )
вызове компилятор знает только, чтоs
это aSup3r
.Sup3r
Не определяетchildMethod
. Рассмотрите возможность того, что существует какой-то другой дочерний классSup3r
. Он не будет определять (это)childMethod
. Компилятору не разрешается предполагать, чтоChild
это единственный существующий подкласс.
Ответ №1:
потому что метод childMethod
существует только в подклассе Child
. Sup3r
не наследует этот метод, Child
поэтому childMethod
его нельзя вызвать с помощью s
.
Если ссылочная переменная s
содержит Child
экземпляр, вы можете заставить ее работать casting
s
Child
сначала с типом, а затем вызвать метод на s.
((Child)s).childMethod();
Если ссылочная переменная s
на самом деле не содержит Child
экземпляра, то вместо этого вы получите a ClassCastException
.
Редактировать:
Есть еще один способ заставить его работать, и это путем создания суперкласса Sup3r
abstract
и добавления абстрактного метода childMethod()
в класс следующим образом:
public abstract class Sup3r {
public void sup3rMethod() {}
public abstract void childMethod();
}
public class Child extends Sup3r {
public void childMethod() {} //implementation code here, the empty block would suffice too however.
}
abstract
означает, что вы оставляете реализацию метода childMethod()
одному из Sup3r
s реализующих подклассов. Если вы внесете это изменение в свой код, вы сможете вызывать childMethod()
on s
без необходимости Child
сначала приводить к нему. Но результат childMethod()
будет зависеть от конкретной childMethod()
реализации метода экземпляра подкласса, на который s
ссылается.
Комментарии:
1. «Аннотация» — это то, что решит мою проблему. У меня был полный ментальный блок по этому поводу! 🙁 Спасибо за вашу помощь.