java - 继承的类问题(子类中的不同方法比超级)[重复]

这个问题在这里已有答案:

我有一个超类动物和一堆继承类......狗,猫和猪等 .

我的问题是所有的狗猫和猪都有自己不同的参数 . 类“动物”是一个介绍参数对象 .

所以,狗可能已经开始..猪可能有getoink ..

我有一种方法可以将“猪”与猪类联系起来......当我得到(“猪”)时,这种方法可以将类型的动物与猪类联系起来 . 与其他人一样机智..

问题是,如果我做动物动物=得到(“猪”),然后尝试使用猪的方法与动物..即 . animal.oink(),我得到“这种类型动物的方法不合适”,因为oink不是动物,而是猪 .

我能想到解决这个问题的唯一方法就是在超类中加入oink,woof,meow,neigh和20种其他方法..这将是愚蠢的,因为狗只需要纬线,而不是哼,喵,嘶,唧唧...... .

我很抱歉这个令人费解的例子......这是我能想到解释的唯一方法..我知道你不能用Java来贬低 . 任何解决方案?

编辑:

这只是一个简单的例子..它不仅仅是一个说话功能 . 例如,一只狗有一个“梳子”功能,猪没有...我可以在超类中有一个通用的dothings()方法,并在子类中有一堆方法多次覆盖相同的dothings方法?

回答(4)

3 years ago

您的问题源于您决定为每个方法赋予不同的名称 . 乍一看,似乎他们都做了不同的事情,因为所有的动物都会发出不同的声音,但是只有一个方法,比如 makeSound ,在 Animal 中声明,然后在子类中实现,这将是一个更好的主意 . 这样,您可以从 Animal 调用该方法 . 这是一个极简主义的例子:

class Animal
{
    public abstract void makeSound();
}

class Pig extends Animal
{
    public void makeSound()
    {
        System.out.println("oink!")
    }
}

class Dog extends Animal
{
    public void makeSound()
    {
        System.out.println("Woof!")
    }
}

允许这样使用:

Animal dog = get("Dog");
dog.makeSound(); //prints "Woof!"

这是有道理的,因为无论它们发出什么声音,每个动物都可以发出声音,因此行为应该在类 Animal 中声明,并且可以为每只动物指定发出的声音而不向类的公共方法添加任何内容 .

3 years ago

如果首先使用 instanceof 测试对象的类型,则可以向下转换 .

但是,在这里使用多态性更好 . 在 Animal 中定义一个抽象 speak 方法,让所有子类实现它,例如在 Dog

public void speak() { System.out.println("woof"); }

然后你在所有类中都有相同的命名方法,无论 animal 的实际类型如何,这都会有效:

Animal animal = get("pig");  // or any other subtype
animal.speak();  // oink

3 years ago

有两种解决方案:

  • 您必须将Animal转换为正确的子类,此解决方案非常脏,并且不使用OO编程的强大功能 . 例如:
if (animal instanceof Pig) {
    ((Pig)animal).oink();
}
  • 您必须为动物类使用泛型方法,例如doVerse(),并且必须在每个子类中重写此方法 .
class Pig extends Animal {

    public void doVerse() {
       System.out.println("oink");
    }
}

3 years ago

此外,如果您想保留说话方法的特定名称(树皮,喵喵,哼等),那么请确保您在该特定动物的实例上调用它们 .

超类的主要功能是为子类提供所有通用的方法,而不必为每个子类编写方法 .

我肯定建议使用其他答案的多态性思想,但是当你继续前进时,它有助于具体了解超类的用途,以及子类如何具有独特的方法 .