0

たとえば、説明するクラスがある場合。Person という名前の people と、Child、Adult Man、Adult Woman などの 6 つのサブクラスがあります。それらはすべて ID、髪の色、目の色などを持っています。異なるのは外見だけなので、すべてのサブクラスにはその独自の paint() メソッド。すべての人は、プログラムがフレーム上のどこに描画する必要があるかを示す 2 つの座標を持っています。すべてのサブクラスは、次のようにそれらの座標を取得します。

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> (Integer は 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 つだけを描画し、次の異なるタイプにスキップすることです。

4

1 に答える 1

1

これはあなたの問題に対する正確な答えではありませんが、Java で継承がどのように機能するかを誤解しているようです。

クラスPersonとそれを継承するクラスがある場合、これは、 a を使用できる場所ならどこでも のインスタンスAdultMan使用できる必要があることを意味します。これがLSPの本質です。したがって、メソッドに次のシグネチャがある場合:AdultManPerson

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 からメソッドを継承します。これを示す実行可能な例は次のとおりです。laughPersonChildlaugh

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
    }
}
于 2012-12-25T15:45:28.070 に答える