Определение подкласса из множества подклассов Java - PullRequest
1 голос
/ 14 ноября 2011

У меня есть интерфейс Tree и абстрактный класс RBTree, который реализует этот интерфейс.У меня также есть несколько классов Tree1 ... Tree9, которые расширяют этот абстрактный класс.

Я написал тестовый модуль, в котором я хочу сделать что-то вроде этого:

public void testRandom(RBTree tree){
    for(int i = 0; i < 10; i++){
        rbTree = new Tree1(); //if the tree in the parameter was of instance Tree1
        rbTree = new Tree2(); //if the tree in the parameter was of instance Tree2
        //etc.

        /**
         * do something with rbTree
         */
    }
}

Возможно ли сделать это без , используя цепочкузаявления (или переключатель) с большим количеством instanceof()?

(примечание: я не могу ничего изменить в дизайне, я знаю, что это не совсем оптимально)

Ответы [ 3 ]

3 голосов
/ 14 ноября 2011

Вы можете использовать tree.getClass().newInstance().

Если вы хотите иметь более сложную логику, чем инстанцирование, вам потребуется либо подход instanceof, либо лучше - сделать, чтобы у каждого подкласса RBTree был метод, который выполняет эту логику (и сделать этот метод абстрактным в RBTree )

2 голосов
/ 14 ноября 2011

Попробуйте это:

rbTree = tree.class.newInstance();
1 голос
/ 14 ноября 2011

Используя отражение, вы можете:

string name = tree.getClass().getName()
Class.forName(name).newInstance();

Проблема в том, что если в реальных реализациях используются разные методы и т. Д., Вы не сможете получить к ним доступ.

...