如果我有一个描述例如的课程。人,名为Person,然后它有6个子类,如Child,Adult Man,Adult Woman等。它们都有ID,头发颜色,眼睛颜色等等。它们的外观不同,所以我的所有子类都包含它们拥有paint()方法。每个人都有两个坐标来告诉程序在框架上绘制它们的位置,所有子类都得到这样的坐标:
class AdultMan extends Person
{
AdultMan(int x, int y) {
super(x,y);
// I haven't yet worked with the hair color, eye color...
// only the coordinates to test my idea out
}
public void paint(Graphics g) {
int x = getX();
int y = getY();
// The drawing of an adult man from basic shapes
// based on the given coordinates (and colors later)
}
}
所以在我处理给定数据的其他类中,我将它们全部放在像Map<Integer,Person>
这样的地图中
(整数是ID)
然后在扩展Jframe的类中,我将地图的值放在一个集合中,并像这样迭代它们:
for (Person person : persons)
{
// (persons is the name of my collection)
if(person.typeName.equals("adultMan"))
{
person = new AdultMan(person.x,person.y);
person.paint(g);
}
}
我有6种类型的人,所以我想对每种类型都这样做。 问题是,如果我的地图中最多有40个人,那么可能会有30个成年人,这只会在框架上绘制第一个并跳到下一个不同的类型。
答案 0 :(得分:1)
这不是您问题的答案,但您似乎误解了继承如何在Java中运行。
如果您有一个班级Person
和一个班级AdultMan
继承它,这意味着您应该可以在任何地方使用AdultMan
的实例可以使用Person
。这是LSP的本质。因此,如果方法具有以下签名:
public void tickle(Person p)
然后,您可以使用AdultMan(或类继承Person的任何其他对象)调用该方法。同样在Java中,如果子类定义与超类相同的方法签名,则称其重写该方法。下面的代码说明了这一点:
class Person {
public void laugh() {
System.out.pring("Tihi");
}
}
class AdultMan extends Person {
public void laugh() {
System.out.pring("Hahaha");
}
}
class AdultWoman extends Person {
public void laugh() {
System.out.pring("Hihihi");
}
}
class Child extends Person { }
AdultMan
和AdultWoman
会覆盖laugh
方法,因此只要在类的实例上调用laugh
方法,类的方法就会叫做。如果持有对象的变量的类型是Person
,则无关紧要。如果有一个方法覆盖了笑方法,那就是获取调用的方法。在Child
类的情况下,它没有定义它自己的laugh
方法,因此只是从Person继承该方法。一个可运行的例子说明了这一点:
public class App {
public static void main(String[] args) {
Person person = new Person();
Person man = new AdultMan();
Person woman = new AdultWoman();
Person child = new Child();
List<Person> persons = new ArrayList();
persons.add(person);
persons.add(man);
persons.add(woman);
persons.add(child);
for(Person p : persons) {
System.out.print("Laugh: ");
p.laugh();
}
// This will print:
// Laugh: Tihi
// Laugh: Hahaha
// Laugh: Hihihi
// Laugh: Tihi
}
}