Вам необходимо переопределить метод setListener(OnSadListener)
в классе Baby
, потому что вы никогда не устанавливаете слушателя.
class Baby extends Person {
OnCryingListener listener;
@Override
void setListener(OnSadListener listener) {
this.listener = (OnCryingListener) listener;
}
void cry() {
listener.imSad();
listener.imCrying();
}
}
Более полным примером является следующий ...
class Person {
protected OnSadListener listener; // Make it protected or add accessor/mutators
void setListener(OnSadListener listener) {
this.listener = listener;
}
}
Сделав listener
защищенным, вы можете повторно использовать Person
class 'OnSadListener
.Вам просто нужно привести слушателя к OnCryingListener
для вызова метода imCrying()
.
class Baby extends Person {
@Override
void setListener(OnSadListener listener) {
this.listener = (OnCryingListener) listener;
}
void cry() {
listener.imSad();
((OnCryingListener) listener).imCrying(); // Cast here
}
}
Обновление
Если вы хотите использовать дженерики, вы можете удалитьпотребность в кастинге.
public class Person <T extends OnSadListener> {
protected T listener;
public void setListener(T listener) {
this.listener = listener;
}
}
Теперь вы можете сказать Baby
, с каким типом слушателя имеет дело.
public class Baby extends Person<OnCryingListener> {
@Override
public void setListener(OnCryingListener listener) {
this.listener = (OnCryingListener) listener;
}
public void cry() {
listener.imSad();
listener.imCrying(); // No need to cast
}
}