如何实现具有不同参数数量的抽象方法

时间:2015-02-27 21:10:06

标签: java inheritance polymorphism overloading override

我有四个类,一个是抽象类,两个是派生类。 在抽象类我有方法编辑,它包含4个参数我希望我的派生类具有相同的方法,但参数数量不同。

抽象类Animal

的代码
public abstract class Animal {

protected String name;
protected String color;
protected String diet;
protected String habitat; }

public abstract void Edit(String name, String color, String diet, String habitat);

派生类狗的代码

public class Dog extends Animal {

private String temperament;
private String breed; }

public void Edit(String name, String color, String diet, String habitat, String temperament, String breed) {

    setName(name);
    setColor(color);
    setDiet(diet);
    setHabitat(habitat);
    setTemperament(temperament);
    setBreed(breed);
}

派生类鸟的代码

public class Bird extends Animal {
private String feather; }

public void Edit(String name, String color, String diet, String habitat,   String feather) {

    setName(name);
    setColor(color);
    setDiet(diet);
    setHabitat(habitat);
    setFeather(feather);
}

我在派生类中遇到错误,我需要这个抽象方法,因为我需要在我的AnimalList类中使用它,如下所示:

public class AnimalList {

ArrayList<Animal> animals = new ArrayList<Animal>();

public void EditDog(String strName, String name, String color, String diet, String habitat, String temperament, String breed){
    for(int i=0; i<animals.size();i++){
        if (animals.get(i) instanceof Dog){
            if(animals.get(i).getName().equals(name))
            {
               animals.get(i).Edit(name, color, diet, habitat, temperament, breed);
            }
        }
    }
}

public void EditBird(String strName, String name, String color, String diet, String habitat, String feather){
    for(int i=0; i<animals.size();i++){
        if (animals.get(i) instanceof Bird){
            if(animals.get(i).getName().equals(name))
            {
               animals.get(i).Edit(name, color, diet, habitat, feather);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果方法Edit对于每种类型的派生类实际上都是不同的,那么你必须检查列表中的对象是什么类(并且你在if (animals.get(i) instanceof Dog){...}中这样做)然后这意味着你的方法不通用=不适用于所有动物。所以我认为有一个抽象的方法是没有意义的。所有派生的抽象类必须具有与超类中声明的方法相同的签名(名称和参数数量)。

为Dog,Bird ...实现单独的Edit方法,并在每个if(...)

中为适用的类投射动物
if (animals.get(i) instanceof Dog){
    if(animals.get(i).getName().equals(name))
    {
         ((Dog) animals.get(i)).Edit(name, color, diet, habitat, temperament, breed);
    }
}