我有一个超类动物和一堆遗产类......狗,猫和猪等。
我的问题是所有的狗猫和猪都有自己不同的参数。类“动物”是一个介绍参数对象。所以,狗可能已经开始..猪可能有getoink ..
我有一种方法将“猪”与猪类联系起来......当我得到(“猪”)时,它会返回一种类型动物的吸气剂;和其他人一样......
问题是,如果我做动物动物=得到(“猪”),然后尝试用动物的猪的方法..即。 animal.oink() 我得到“对于动物类型来说,这种方法不合适”,因为oink不是动物,而是猪。
我能想到解决这个问题的唯一方法就是在超类中添加oink,woof,meow,neigh和20种其他方法..这将是愚蠢的,因为狗只需要woof,而不是oink,meow,neigh,啁啾...
我为这个错综复杂的例子感到抱歉..这是我能想到解释的唯一方法..我知道你不能用Java来贬低任何解决方案吗?
编辑:
这只是一个简单的例子..不仅仅是一个说话功能。例如,一只狗有一个“梳子”功能,猪没有... 我可以在超类中使用泛型dothings()方法,并在子类中有一堆方法多次覆盖相同的dothings方法吗?
答案 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)
有两种解决方案:
您必须将Animal转换为正确的子类,此解决方案非常脏,并且不使用OO编程的强大功能。例如:
if (animal instanceof Pig) {
((Pig)animal).oink();
}
您必须为动物类使用泛型方法,例如doVerse(),并且必须在每个子类中重写此方法。
class Pig extends Animal {
public void doVerse() {
System.out.println("oink");
}
}
答案 3 :(得分:0)
此外,如果您想保留说话方法的特定名称(树皮,喵喵,哼等),请确保您在该特定动物的实例上调用它们。
一个超类' main函数是为子类提供所有通用的方法,而不必为每个子类编写方法。
我绝对建议使用其他答案的多态性思想,但是当你继续前进时,它有助于具体了解超类的用途,以及子类如何具有独特的方法。