我已经建立了一个狗窝系统,使用.txt文件检查狗进入系统,允许您执行各种操作,如搜索,删除,打印等。
我目前正在使用继承为猫添加功能,因为它们共享许多相同的变量(名称,喜欢的食物等)。
我正在使用狗和猫独有的布尔值,这对于狗来说是“像狗一样的狗”,而“猫可以为猫分享奔跑”。
我遇到了使用继承的问题,因为两个布尔值不一样(显然)并且在代码中使用不同的变量/标识符(这里不确定正确的术语,如果可能的话请告诉我)和它正在抛出错误。
这是我到目前为止的内容
import java.util.ArrayList;
public class Pet {
protected ArrayList<Owner> originalOwners;
//private boolean likesBones;
protected String petName;
protected String favFood;
protected int foodPerDay;
public Pet(String name, ArrayList<Owner> owners, String food, int mealsPerDay) {
petName = name;
this.favFood = food;
this.foodPerDay = mealsPerDay;
originalOwners = new ArrayList<Owner>();
for(Owner o: owners){
Owner copy = new Owner(o.getName(), o.getPhone());
originalOwners.add(copy);
}
}
public String getName() {
return petName;
}
public void setName(String newName) {
petName = newName;
}
/**
* Returns a copy of the original owners
* @return A copy of the original owners as an array
*/
public Owner[] getOriginalOwners(){
Owner[] result = new Owner[originalOwners.size()];
result = originalOwners.toArray(result);
return result;
}
/**
* How many times a day to feed the dog
* @param feeds The number of feeds per day
*/
public void setFeedsPerDay(int feeds){
foodPerDay = feeds;
}
/**
* The number of feeds per day the dog is fed
* @return The number of feeds per day
*/
public int getFeedsPerDay(){
return foodPerDay;
}
/**
* What's his favourite food?
* @param food The food he likes
*/
public void setFavouriteFood(String food){
favFood = food;
}
/**
* The food the dog likes to eat
* @return The food
*/
public String getFavouriteFood(){
return favFood;
}
/**
* Note that this only compares equality based on a
* dog's name.
* @param The other dog to compare against.
*/
@Override
public boolean equals(Object obj) { // Generated by Eclipse to be more robust
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dog other = (Dog) obj;
if (petName == null) {
if (other.petName != null)
return false;
} else if (!petName.equals(other.petName))
return false;
return true;
}
/**
* A basic implementation to just return all the data in string form
*/
public String toString() {
return "Dog name:" + petName + "Original Owner:" + originalOwners + "Favfood:" + favFood
+ "FoodPerDay:" + foodPerDay;
}
}
狗类:
import java.util.ArrayList;
public class Dog extends Pet {
public static boolean likesBones;
public Dog(String name, ArrayList<Owner> owners, String food, int mealsPerDay, boolean likeBones) {
super(name, owners, food, mealsPerDay);
Dog.likesBones = likeBones;
}
/**
* Does the dog like bones?
* @return true if he does
*/
public static boolean getLikesBones() {
return likesBones;
}
}
猫类
import java.util.ArrayList;
public class Cat extends Pet {
public static boolean shareRun;
public Cat(String name, ArrayList<Owner> owners, String food, int mealsPerDay, boolean shareRun) {
super(name, owners, food, mealsPerDay);
Cat.shareRun = shareRun;
}
public boolean getShareRun(boolean doesShare) {
return shareRun;
}
}
我无法将likeBones和shareRun的布尔值添加到Pet(),因为它们来自不同的类,所以如果我想添加一条狗,我会得到一个零点异常(我相信)和副对猫来说也是如此。
我的问题:我怎样才能在Pet()类中支持猫和狗的布尔值,而不会抛出异常?
如果这个问题有意义,请告诉我。我之前解释过我的问题时遇到了一些麻烦(编程新手)。 先谢谢你们。
答案 0 :(得分:1)
因为喜欢的狗特定于狗,它应该只存在于Dog类中,而不是父类Pet类。同样,shareRun只应存在于Cat类中,而不是父类Pet类。
从逻辑上考虑结构。父类应包含所有其子级使用的信息 - 它的目的是允许共享功能。未共享的功能不属于,旨在帮助共享功能。
如果您需要为Pet的任何子项使用该布尔值的函数,您可以执行的操作是在父级中定义泛型boolean special
并实现使用它的函数,然后在其他位置跟踪每种类型的函数宠物special
是什么 - 但不知道你的系统我不确定它对你最好。
答案 1 :(得分:0)
嘿,我想你可能想强迫Dog和Cat设置Pet中声明的布尔值。也许在Pet中创建一个抽象方法,然后将它放在Pet构造函数中。
class abstract Pet {
...
public Pet() {
...
setRandomBoolean();
}
...
protected abstract void setRandomBoolean();
...
}
很明显,阅读这段代码,喜欢骨骼的属性(狗什么都没有?)和共享游戏的属性过于抽象和无关。
就像BIU所说,他们应该完全分开实施。
答案 2 :(得分:0)
您的Cat课程几乎正确设置了私人shareRun字段和公共getter和setter。但为什么这个类还有一个公共静态shareRun字段?
你的Dog课程应该遵循与LikeBones相同的模式。目前,您已将其设置为静态属性,这是错误的。
如果您尝试执行类似
之类的操作,则会收到错误消息Pet fido = new Pet();
dodo.setLikesBones(true);
您将收到编译器错误,因为Pet没有声明该方法。
您可以在Pet上声明这些字段和方法,但是猫和狗都可以选择喜欢骨骼并且能够分享跑步。
使用基类来共享公共属性和子类以进行区分。
这有意义吗?