-2

このクラスがあったとします

Animal.java

public class Animal {

    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public void shout() {
        /* must be override */
    }

    public String getName() {
        return name;
    }
}

Driver.java

import java.util.ArrayList;
import java.util.List;

public class Driver {
    public static void main(String[] args) {

    List<Animal> animals = new ArrayList<Animal>();
    animals.add(new Animal("Dog") {

        @Override
        public void shout() {
            System.out.println(getName() + " sounds like: woof woof woof");
        }
    });

    animals.add(new Animal("Cat") {

        @Override
        public void shout() {
            System.out.println(getName() + " sounds like: meow meow meow-ow");
        }
    });

    for(Animal a : animals)
        a.shout();
    }
}

メソッドshout()または他のプログラマーを実装するように私を後押しするにはどうすればよいですか? Animal クラスを抽象化し、Animal を拡張する Dog、Cat などのクラスを作成する理由がないとします。

デザインパターンはありますか?

4

4 に答える 4

0

動物を抽象化せずに動物が行うことを猫と犬にさせたい場合は、そうすることができます。

public class Cat extends Animal

Animal が Abstract または通常の完全に実装されたクラスである場合に機能します。インターフェイスには extends の代わりにimplements を使用します。

于 2013-07-09T19:44:09.333 に答える
0

うーん、戦略パターンが役立ちます。

public class Animal {

   private Shoutable shoutable;  
   private String name;

    public Animal(String name) {
        this.name = name;
    }

    public void shout() {
        shoutable.shout();
    }

    public String getName() {
        return name;
    }

    public void setShout(Shoutable shoutable){
       this.shoutable=shoutable;
    }
}


public interface Shoutable{
  void shout();
}

public class DogShout implements Shoutable{
  @Override
  public void shout{
   System.out.println("woff gua guaa gua woff");
  }
}
于 2013-07-09T19:44:13.693 に答える