继承类问题(子类中的方法不同于父类)



我有一个超类animal和一堆继承类…狗、猫、猪等

我的问题是所有的狗猫和猪都有自己不同的参数…类"animal"是一个引入参数对象。

所以,狗可能会吠…猪可能有ink.

我有一个方法将"pig"与类pig联系起来。getter返回动物类型,当我得到("pig");和其他人一样……

问题是,如果我做Animal Animal = get("pig"),然后尝试用猪的方法与动物…ie。animal.oink (),我得到"The method is undef for The type animal",因为oink不在animal中,而是在pig中。

我能想到的解决这个问题的唯一方法是在超类中放入oink, woof, meow, neigh和其他20个方法。那就太傻了,因为狗只需要喵喵叫,而不需要哼哼、喵喵、嘶嘶、唧唧……

我为这个复杂的例子感到抱歉…这是我唯一能想到的解释……我知道你不能在Java中向下投射。有解决方案吗?

编辑:

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

您的问题源于您决定给每个方法一个不同的名称。乍一看,似乎它们都做不同的事情,因为所有的动物都发出不同的声音,但这将是一个更好的主意,只有一个方法,说,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中声明,并且可以为每个动物指定发出的声音,而不需要在类的公共方法中添加任何内容。

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

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

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

那么在所有类中都有相同的命名方法,无论animal的实际类型如何,这都将起作用:

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

有两种解决方案:

  1. 您必须将您的Animal转换为正确的子类,这种解决方案非常脏,并且不使用面向对象编程的功能。例如:

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

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

另外,如果您希望为说话方法保留特定的名称(bark, meow, oink等),那么请确保在该特定动物的实例上调用它们。

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

我绝对建议采用另一个答案的多态性思想,但随着您继续前进,它有助于具体了解超类的用途,以及子类如何具有独特的方法。

最新更新