This question has been asked in a C++ context pero tengo curiosidad acerca de Java. Las preocupaciones acerca de los métodos virtuales no se aplican (creo), pero si usted tiene esta situación:Método de encadenamiento + herencia no funcionan bien juntas?
abstract class Pet
{
private String name;
public Pet setName(String name) { this.name = name; return this; }
}
class Cat extends Pet
{
public Cat catchMice() {
System.out.println("I caught a mouse!");
return this;
}
}
class Dog extends Pet
{
public Dog catchFrisbee() {
System.out.println("I caught a frisbee!");
return this;
}
}
class Bird extends Pet
{
public Bird layEgg() {
...
return this;
}
}
{
Cat c = new Cat();
c.setName("Morris").catchMice(); // error! setName returns Pet, not Cat
Dog d = new Dog();
d.setName("Snoopy").catchFrisbee(); // error! setName returns Pet, not Dog
Bird b = new Bird();
b.setName("Tweety").layEgg(); // error! setName returns Pet, not Bird
}
En este tipo de jerarquía de clases, ¿hay alguna manera de volver this
de una manera que no lo hace (efectivamente) upcast el tipo de objeto?
Ahora entiendo por qué tanta gente odia Java. –