所以我有这个结构 - 一个名为Animal
的接口:
public interface Animal {
public String move ();
public String makeSound();
public String getType();
}
然后是一个名为AbstractBird
的抽象类,它实现了Anima
:
public abstract class AbstractBird implements Animal {
public String birdType;
public String getType() {
return birdType;
}
@Override
public String move() {
return "Fly";
}
}
然后是几个使用相同结构扩展AbstractBird
的类,并调用Dove
,Hawk
,Eagle
等等。看起来像这样:
public class Eagle extends AbstractBird {
public Eagle() {
birdType = "Eagle";
}
@Override
public String makeSound() {
return "Noone knows";
}
}
然后是我的班级AnimalSound
,其中包含main
方法:
public class AnimalSound {
public static void main(String[] args) {
Eagle e = new Eagle();
Dove d = new Dove();
Hawk h = new Hawk();
play(e);
play(d);
play(h);
}
public static void play(Animal a) {
System.out.println("````````````");
System.out.println(a.getType());
System.out.println(a.makeSound());
System.out.println(a.move());
}
}
正如您所看到的,我使用此方法getType()
返回birdtype
。方法本身是在抽象类中实现的,但是仍然要获得正确的birType
我需要为每个我可以初始化birdType
的类编写构造函数,这就是我要做的部分好像很多。所以我的问题是如何在抽象类中实现getType()
方法,以便返回类的名称和/或对象的名称。我不确定在我的例子中哪个类更好,这些类有鸟的名字,但想到它我觉得回到目标名称可能更有意义。
答案 0 :(得分:4)
@Leron
这是一个例子:
class Untitled {
private static abstract class Animal {
public String getType() {
return this.getClass().getSimpleName();
}
}
private static class Bird extends Animal {
}
private static class Dog extends Animal {
}
public static void main(String[] args) {
Animal bird = new Bird();
System.out.println(bird.getType()); // prints Bird
Animal dog = new Dog();
System.out.println(dog.getType()); // prints Dog
}
}
因此,您将获得正确的类型名称,并且您不需要在每个派生类型中实现构造函数。后期绑定将为您解决此问题。