如何调用子类'如果我不知道有多少次我必须这样做,那么这个方法不止一次?

时间:2012-12-25 14:50:12

标签: java collections map polymorphism

如果我有一个描述例如的课程。人,名为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个成年人,这只会在框架上绘制第一个并跳到下一个不同的类型。

1 个答案:

答案 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 { }

AdultManAdultWoman会覆盖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
    }
}