classes and inheritance revisited
After all the discussion about the last set of questions I posted, I
decided to proceed with a simpler version of the Animal class hierarchy.
Everything is in one package (main..bad name but it works).
I have an Animal (hey RedGritty...I made those changes...still not quite
what I want)
package main;
public class Animal {
private String type;
private char gender;
private int numberOfLegs;
private char warmOrCold;
private char birthType;
private char eatType;
public Animal(String type, char gender, int numberOfLegs, char
warmOrCold, char birthType, char eatType) {
super();
this.type = type;
this.gender = gender;
this.numberOfLegs = numberOfLegs;
this.warmOrCold = warmOrCold;
this.birthType = birthType;
this.eatType = eatType;
}
void move() {}
void sleep(){}
void giveBirth() {}
void eat() {}
public char getBirthType() {
return birthType;
}
public void setBirthType(char birthType) {
this.birthType = birthType;
}
public char getEatType() {
return eatType;
}
public void setEatType(char eatType) {
this.eatType = eatType;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getNumberOfLegs() {
return numberOfLegs;
}
public void setNumberOfLegs(int numberOfLegs) {
this.numberOfLegs = numberOfLegs;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public char getWarmOrCold() {
return warmOrCold;
}
public void setWarmOrCold(char warmOrCold) {
this.warmOrCold = warmOrCold;
}
void showAll() {
System.out.println("type: " + type );
System.out.println("gender: " + gender);
System.out.println("numberOfLegs: " + numberOfLegs);
System.out.println("warmOrCold: " + warmOrCold );
System.out.println("birthType: " + birthType );
System.out.println("eatType: " + eatType );
}
}
Here is a Cat
package main;
public class Cat extends Animal {
public Cat(String type, char gender, int numberOfLegs, char warmOrCold,
char birthType, char eatType) {
super(type, gender, numberOfLegs, warmOrCold, birthType, eatType);
}
}
Here is a HouseCat
package main;
public class HouseCat extends Cat {
String catName;
public HouseCat(String houseCatName, String type, char gender, int
numberOfLegs, char warmOrCold, char birthType, char eatType) {
super(type, gender, numberOfLegs, warmOrCold, birthType, eatType);
// TODO Auto-generated constructor stub
this.catName = houseCatName;
}
void move() {
System.out.println("pounce");
}
void eat() {
System.out.println("yummy");
}
void showAll() {
super.showAll();
System.out.println("Name: " + catName);
}
}
And here is my HouseCatTest
package main;
public class HouseCatTest {
public static void main(String[] args) {
HouseCat hc = new HouseCat("Sparkles", "tabby", 'm', 4, 'w', 'l', 'c');
hc.showAll();
}
}
Output:
type: tabby
gender: m
numberOfLegs: 4
warmOrCold: w
birthType: l
eatType: c
Name: Sparkles
Which is exactly what I wanted.
See the thing is: I see Animal as more of an Interface that is
implemented by Cat than as a Class. But an Interface has no instance
variables so how can I make Animal an interface? That would mean that
the instance variable of Animal would have to be contained in the
classes that implement the interface. Can you say, "code duplication"?
Is there an alternative or a better way to work this together.
Here's my image
An animal knows about:
type : What kind of animal is it
gender : mALE or fEMALE
numberOfLegs : 0, 2, 4 whatever
warmOrCold : wARMBLOODED or cOLDBLOODED
birthType : lIVE or eGGS
eatType : cARNIVOR, oMNIVORE, hERBIVORE
and probably a bunch more
An animal knows how to:
move
sleep
giveBirth
eat
and probably a bunch more
A cat knows about everything that an Animal knows about (a cat IS-A animal)
But a Cat also knows about:
itsTail : some Animals don't have one so this instance variable needs to
be in cat
breed: breaking down Animal further
and it knows how to:
huntInPacks
makeNoise (not all Animals make audible noises)
A HouseCat knows about everything that a Cat knows about (a housecat
IS-A cat)
But a HouseCat also knows about:
itsName: you give your pets names don't you?
and knows how to
chaseAMouse
So to me, Animal in an interface.
Cat is an interface that implements Animal (but an interface can't and
implement an interface, at least that's what Eclipse is saying)
And HouseCat should both extend and implement Cat, but I can't do that
either. This is getting frustrating...what am I missing.