Ответ
Один из способов сделать это - добавить подходящих конструкторов в ваши классы.Смотрите ниже:
public class Animal {
int a, b, c;
public Animal(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
}
public class Dog extends Animal {
int d, e;
public Dog(int a, int b, int c, int d, int e) {
super(a, b, c);
this.d = d;
this.e = e;
}
}
public class Cat extends Animal {
int f, g;
public Cat(int a, int b, int c, int f, int g) {
super(a, b, c);
this.f = f;
this.g = g;
}
}
Теперь, чтобы создать экземпляры объектов, вы можете сделать следующее:
ArrayList<Animal> listAnimal = new ArrayList();
//sample values
int a = 10;
int b = 5;
int c = 20;
if(condition) {
listAnimal.add(new Dog(a, b, c, 9, 11));
//created and added a dog with e = 9 and f = 11
}
else {
listAnimal.add(new Cat(a, b, c, 2, 6));
//created and added a cat with f = 2 and g = 6
}
Это метод, который я бы использовал в этом случае.Это делает код чище и более читабельным, избегая множества «установленных» методов.Обратите внимание, что super()
является вызовом конструктора суперкласса (в данном случае Animal
).
Бонус
Если вы не планируете создавать экземпляры класса Animal
, вы должны объявить его как abstract
. Абстрактные классы не могут быть созданы, но могут быть разделены на подклассы и могут содержать абстрактные методы .Эти методы объявляются без тела, а это означает, что все дочерние классы должны обеспечивать его собственную реализацию.Вот пример:
public abstract class Animal {
//...
//all animals must eat, but each animal has its own eating behaviour
public abstract void eat();
}
public class Dog {
//...
@Override
public void eat() {
//describe the eating behaviour for dogs
}
}
Теперь вы можете позвонить eat()
для любого животного!В предыдущем примере со списком животных вы можете сделать следующее:
for(Animal animal: listAnimal) {
animal.eat();
}