我有一个超类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
有两种解决方案:
-
您必须将您的Animal转换为正确的子类,这种解决方案非常脏,并且不使用面向对象编程的功能。例如:
if (animal instanceof Pig) { ((Pig)animal).oink(); }
-
你必须为动物类使用一个泛型方法,例如doVerse(),并且你必须在每个子类中重写这个方法。
class Pig extends Animal { public void doVerse() { System.out.println("oink"); } }
另外,如果您希望为说话方法保留特定的名称(bark, meow, oink等),那么请确保在该特定动物的实例上调用它们。
父类的主要功能是为子类提供所有通用的方法,而不必为每个子类编写方法。
我绝对建议采用另一个答案的多态性思想,但随着您继续前进,它有助于具体了解超类的用途,以及子类如何具有独特的方法。