I would like to refactor some code that currently consists of a superclass and two subclasses.
These are my classes:
public class Animal { int a; int b; int c; } public class Dog extends Animal { int d; int e; } public class Cat extends Animal { int f; int g; }
This is my current code:
ArrayList<Animal> listAnimal = new ArrayList<>(); if (condition) { Dog dog = new Dog(); dog.setA(..); dog.setB(..); dog.setC(..); dog.setD(..); dog.setE(..); listAnimal.add(dog); } else { Cat cat = new Cat(); cat.setA(..); cat.setB(..); cat.setC(..); cat.setF(..); cat.setG(..); listAnimal.add(cat); }
How can I refactor the code regarding the common attributes?
I would like something like that:
Animal animal = new Animal(); animal.setA(..); animal.setB(..); animal.setC(..); if (condition) { Dog anim = (Dog) animal; //I know it doesn't work anim.setD(..); anim.setE(..); } else { Cat anim = (Cat) animal; //I know it doesn't work anim.setF(..); anim.setG(..); } listAnimal.add(anim);
The superclass method is used to access the parent class inside a child class. This method has a variety of uses when inheriting parent members.
Yes, you can call the methods of the superclass from static methods of the subclass (using the object of subclass or the object of the superclass).
In object-oriented programming, a class from which other classes inherit code is called a superclass. Furthermore, the class that inherits the code is called a subclass of that superclass. Typically, a subclass inherits the instance variables and member functions of its superclass.
A superclass is the class from which many subclasses can be created. The subclasses inherit the characteristics of a superclass. The superclass is also known as the parent class or base class. In the above example, Vehicle is the Superclass and its subclasses are Car, Truck and Motorcycle.
Your idea to have a variable of type Animal
is good. But you also have to make sure to use the right constructor:
Animal animal; // define a variable for whatever animal we will create if (condition) { Dog dog = new Dog(); // create a new Dog using the Dog constructor dog.setD(..); dog.setE(..); animal = dog; // let both variables, animal and dog point to the new dog } else { Cat cat = new Cat(); cat.setF(..); cat.setG(..); animal = cat; } animal.setA(..); // modify either cat or dog using the animal methods animal.setB(..); animal.setC(..); listAnimal.add(animal);
Hint: If an Animal is always either Cat or Dog consider making Animal abstract
. Then the compiler will automatically complain whenever you try to do new Animal()
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With