Как использовать отражение с несколькими классами, расширяющими базовый класс в Java - PullRequest
0 голосов
/ 29 октября 2019

Я очень новичок в размышлениях, и я хотел бы получить некоторые советы / помощь. Я пытаюсь получить имена подклассов, используя отражение в базовом классе. У меня есть несколько подклассов (Cat, Dog, Frog и т. Д.), И все они расширяют базовый класс (Animal).

То, что я хочу сделать, это получить имена классов от самих подклассов и передать их через конструкторы, чтобы Animal не создавал экземпляры десятков подклассов. Ниже приведен пример того, что я НЕ пытаюсь сделать.

Если есть способ просто динамически получать имена подклассов, не проходя через процесс создания экземпляров каждого отдельного подкласса, я хотел бы увидеть это. Ваша помощь очень ценится.

class Dog extends Animal {
    private String s;

    public Dog() {
        s = "Bark";
    }

    public void method() {
        System.out.println("Dogs " + s);
    }
}

class Cat extends Animal {
    private String s;

    public Cat() {
        s = "Meow";
    }

    public void method() {
        System.out.println("Cats " + s);
    }
}

class Animal {
    public static void main(String args[]) throws Exception {
        Dog dog = new Dog();
        Cat cat = new Cat();
        Class cls = dog.getClass();
        System.out.println("The name of class is " + cls.getName());
        Constructor constructor = cls.getConstructor();
        System.out.println("The name of constructor is " + constructor.getName());
    }
}

1 Ответ

0 голосов
/ 29 октября 2019

Не понимаю, зачем вам имена подклассов. Если проблема заключается в создании экземпляра класса на основе его имени, было бы лучше использовать шаблон Abstract Factory. Вы можете создать перечисление, которое содержит знакомое вам животное

enum ANIMALS {
    DOG, CAT
  }

Вы можете создать интерфейс Animal

public interface Animal {

}

классы, расширяющие Animal как классы по умолчанию

public class Dog implements Animal {

}

затем, наконец, AnimalAbstractFactory как

  public class AnimalAbstractFactory {

  public enum ANIMALS {
    DOG, CAT
  }

  public Animal createAnimal(ANIMALS animal) {
    switch (animal) {
      case DOG:
        return new Dog();
      case CAT:
        return new Cat();
    }
    return null;
  }
}

. Отмечает, что теперь вам не нужно знать подкласс для создания экземпляра животного. Также обратите внимание, что createAnimal возвращает Animal , а не подкласс. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...