Единственные примеры переопределения полиморфных методов, которые я когда-либо видел, включают методы, которые не принимают параметров или, по крайней мере, имеют идентичные списки параметров.Рассмотрим обычный пример Animal / Dog / Cat:
public abstract class Animal
{
public abstract void makeSound();
}
public class Dog extends Animal
{
public void makeSound()
{
System.out.println("woof");
}
}
public class Cat extends Animal
{
public void makeSound()
{
System.out.println("meow");
}
}
public class ListenToAnimals
{
public static void main(String[] args)
{
AnimalFactory factory = new AnimalFactory();
Animal a = factory.getRandomAnimal(); // generate a dog or cat at random
a.makeSound();
}
}
В этом случае все работает просто отлично.Теперь давайте добавим еще один метод, который частично реализуется в абстрактном классе, в то же время получая более конкретное поведение в подклассах:
public abstract class Animal
{
public abstract void makeSound();
public void speak(String name)
{
System.out.println("My name is " + name);
}
}
public class Dog extends Animal
{
public void makeSound()
{
System.out.println("woof");
}
public void speak(String name)
{
super.speak(name);
System.out.println("I'm a dog");
}
}
public class Cat extends Animal
{
public void makeSound()
{
System.out.println("meow");
}
public void speak(String name, int lives)
{
super.speak(name);
System.out.println("I'm a cat and I have " + lives + " lives");
}
}
public class ListenToAnimals
{
public static void main(String[] args)
{
AnimalFactory factory = new AnimalFactory();
Animal a = factory.getRandomAnimal(); // generate a dog or cat at random
a.makeSound();
// a.speak(NOW WHAT?
}
}
В этой последней (закомментированной) строке основного метода я не знаюположить туда, потому что я не знаю, какой тип животных у меня есть.Мне не приходилось беспокоиться об этом раньше, потому что makeSound () не принимала никаких аргументов.Но Speak () делает, и аргументы зависят от типа Animal.
Я читал, что некоторые языки, такие как Objective-C, допускают списки переменных аргументов, поэтому такая проблема никогда не должна возникать,Кто-нибудь знает, как реализовать такие вещи в Java?