java - tipos - Llamando a un método de subclase desde superclase
superclase java (4)
Estoy en un curso introductorio de java y acabamos de empezar a aprender sobre la herencia. Estoy trabajando en una tarea que nos pide que creemos una superclase "Mascota" con nombre y edad; y tres subclases, cada una con su propio rasgo único (elegí "Perro", "Gato" y "Pájaro"). Una vez que hayamos construido todo esto, debemos crear una clase principal para probar todo, y aquí es donde me estoy encontrando con problemas. Estoy intentando llamar a los métodos get
para estos rasgos únicos dentro de Main
, pero parece que solo encuentra métodos que están en la superclase.
Aquí está la clase principal:
public class Kennel {
public static void main(String[] args) {
// Create the pet objects
Pet cat = new Cat("Feline", 12, "Orange");
Pet dog = new Dog("Spot", 14, "Dalmation");
Pet bird = new Bird("Feathers", 56, 12);
// Print out the status of the animals
System.out.println("I have a cat named " + cat.getName()
+ ". He is " + cat.getAge() + " years old."
+ " He is " + cat.getColor()
+ "When he speaks he says " + cat.speak());
System.out.println("I also have a dog named " + dog.getName()
+ ". He is " + dog.getAge() + " years old."
+ " He is a " + dog.getBreed()
+ " When he speaks he says " + dog.speak());
System.out.println("And Finally I have a bird named "
+ bird.getName() + ". He is " + bird.getAge() + " years old."
+ " He has a wingspan of " + bird.getWingspan() + " inches."
+ " When he speaks he says " + bird.speak());
}
}
Aqui esta mi superclase
abstract public class Pet {
private String name;
private int age;
// Constructor
public Pet(String petName, int petAge) {
this.name = petName;
this.age = petAge;
}
// Getters
public String getName() { return(this.name); }
public int getAge() { return(this.age); }
// Setters
public void setName(String nameSet) { this.name = nameSet; }
public void setAge(int ageSet) { this.age = ageSet; }
// Other Methods
abstract public String speak();
// toString
@Override
public String toString() {
String answer = "Name: " + this.name + " Age: " + this.age;
return answer;
}
}
Y aquí está una de las subclases (todas parecen iguales y tienen el mismo error)
public class Cat extends Pet {
private String color;
// Constructor
public Cat(String petName, int petAge, String petColor) {
super(petName, petAge);
this.color = petColor;
}
// Getters
public String getColor() { return(this.color); }
// Setters
public void setColor(String colorSet) { this.color = colorSet; }
// Other Methods
@Override
public String speak() { return "Meow!"; }
// toString
@Override
public String toString() {
String answer = "Name: " + super.getName() + " Age: "+super.getAge()
+ " Color: " + this.color;
return answer;
}
}
Entonces, lo que está sucediendo es que no puedo obtener el método principal para encontrar el método cat.getColor()
, o cualquiera de los otros únicos de las subclases.
Aquí está intentando crear un objeto de tipo Superclase (cat) utilizando el constructor (Cat), que es un método de subclase, que no es posible. Esto es violar la regla de herencia.
Pet cat = new Cat("Feline", 12, "Orange");
Cuando declara que una variable tiene el tipo de superclase, solo puede acceder a los métodos (públicos) y variables miembro de la superclase a través de esa variable.
Pet cat = new Cat("Feline",12,"Orange");
cat.getName(); // this is OK
cat.getColor(); // this is not OK, getColor() is not in Pet
Para acceder a los métodos en la clase concreta ( Cat
en este caso), debe declarar la variable como la clase derivada
Cat cat = new Cat("Feline",12,"Orange");
cat.getName(); // OK, getName() is part of Cat (and the superclass)
cat.getColor(); // OK, getColor() is part of Cat
O cámbielo a un tipo que sepa / sospeche que sea el tipo concreto
Pet cat = new Cat("Feline",12,"Orange");
((Cat)cat).getName(); // OK (same as above)
((Cat)cat).getColor(); // now we are looking at cat through the glass of Cat
Incluso puedes combinar los dos métodos:
Pet pet = new Cat("Feline",12,"Orange");
Cat cat = (Cat)pet;
cat.getName(); // OK
cat.getColor(); // OK
Cuando haces esto:
Pet cat = new Cat("Feline",12,"Orange");
El compilador ve la variable cat como Pet. Así que no puedes usar el método específico de clasificación de gato.
Tienes que declarar cat como Type Cat para resolver tu problema.
Saludos.
Pet cat = new Cat("Feline",12,"Orange");
^^^
This is the error.
Pet
no tiene un método llamado getColor()
Necesitas hacer:
Cat cat = new Cat(...);