从2个类继承不同的布尔值

时间:2015-04-19 18:53:17

标签: java inheritance

我已经建立了一个狗窝系统,使用.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()类中支持猫和狗的布尔值,而不会抛出异常?

如果这个问题有意义,请告诉我。我之前解释过我的问题时遇到了一些麻烦(编程新手)。 先谢谢你们。

3 个答案:

答案 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上声明这些字段和方法,但是猫和狗都可以选择喜欢骨骼并且能够分享跑步。

使用基类来共享公共属性和子类以进行区分。

这有意义吗?