java - 继承类问题(子类中的不同方法比super)

时间:2014-07-08 21:06:41

标签: java inheritance

我有一个超类动物和一堆遗产类......狗,猫和猪等。

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

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

我有一种方法将“猪”与猪类联系起来......当我得到(“猪”)时,它会返回一种类型动物的吸气剂;和其他人一样......

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

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

我为这个错综复杂的例子感到抱歉..这是我能想到解释的唯一方法..我知道你不能用Java来贬低任何解决方案吗?

编辑:

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

4 个答案:

答案 0 :(得分:1)

您的问题源于您决定为这些方法赋予不同的名称。乍一看,似乎他们都做了不同的事情,因为所有的动物都会发出不同的声音,但是只有一个方法,比如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中声明,并且可以为每只动物指定声音而不添加任何声音到班级的公共方法。

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

有两种解决方案:

  1. 您必须将Animal转换为正确的子类,此解决方案非常脏,并且不使用OO编程的强大功能。例如:

    if (animal instanceof Pig) {
        ((Pig)animal).oink();
    }
    
  2. 您必须为动物类使用泛型方法,例如doVerse(),并且必须在每个子类中重写此方法。

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

答案 3 :(得分:0)

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

一个超类' main函数是为子类提供所有通用的方法,而不必为每个子类编写方法。

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