2

だから私はこの構造を持っています - と呼ばれるインターフェース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次に、同じ構造で拡張されDoveHawk、などと呼ばれるいくつかのクラスが次のように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()メソッドを抽象クラスに実装して、クラスの名前やオブジェクトの名前を返す方法です。クラスが鳥の名前を持っている私の例ではどちらが良いかわかりませんが、それを考えると、オブジェクトの名前に戻る方が理にかなっていると思います。

4

1 に答える 1

4

@レロン

以下に例を示します。

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
  }
}

その結果、適切な型名が得られ、派生型ごとにコンストラクターを実装する必要がなくなります。遅延バインディングは、この問題を解決します。

于 2012-10-27T19:06:15.637 に答える