2015-07-01 3 views
3

Я хочу создать новый экземпляр в зависимости от объекта, где у меня есть переменная суперкласса. Возможно ли это без реализации функции getNew() или без использования уродливой if-цепи? Другими словами: Как реализовать следующую функцию newSubClass (..) без использования функции getNew()?java polymorphism, создающий новый объект подкласса, используя переменную суперкласса

public abstract class SuperClass { 
    abstract public SuperClass getNew(); 
} 

public class SubClassA extends SuperClass { 
    @Override 
    public SuperClass getNew() { 
     return new SubClassA(); 
    } 
} 

public class SubClassB extends SuperClass { 
    @Override 
    public SuperClass getNew() { 
     return new SubClassB(); 
    } 
} 

private SuperClass newSubClass(SuperClass superClass) { 
    return superClass.getNew(); 
} 
+0

Полиморфизм - это самое чистое решение этой проблемы, и вы уже реализовали его. Когда Java Reflection является решением, я очень сильно сомневаюсь, действительно ли это. Отражение обходит систему типов и делает статический анализ и автоматический рефакторинг более сложными или непрактичными. Сохранение кода плохо сбалансировано с потерей рефакторинга. Код в основном ценен для бизнеса за его способность меняться в соответствии с новыми требованиями, а не в его способности быть короткими. –

ответ

1

Afte У меня было время подумать и вклад zv3dh, я решил этот второй ответ.

Теперь я получаю новый экземпляр экземпляра класса SuperClass подкласса, не зная конкретного подтипа во время выполнения.

Для этого у вас есть «рефлексия».

public abstract class A_SuperClass { 
    public A_SuperClass createNewFromSubclassType(A_SuperClass toCreateNewFrom) { 
     A_SuperClass result = null; 
     if (toCreateNewFrom != null) { 
      result = toCreateNewFrom.getClass().newInstance();  
     } 
     // just an example, add try .. catch and further detailed checks 
     return result; 
    } 
} 

public class SubClassA extends A_SuperClass { 

} 

public class SubClassB extends A_SuperClass { 

} 

Если вы ищете «java reflexion», вы получите массу результатов здесь, в SO и в Интернете.

+0

Вы очень мудрый джентльмен! Нет необходимости в отливке SuperClass. – Klaus

+0

Спасибо, Клаус. Рад, что ты получил свой ответ. Удалено литье. –

0

Посмотрите на шаблон дизайна «FactoryMethod».

Это именно то, что вы ищите: оно инкапсулирует «нового» оператора.

Однако ваш пример заставляет меня задаться вопросом:

  • Ваш getNew() переопределяет то, что конструктор будет делать в любом случае

Попробуйте что-то вроде этого:

public abstract class SuperClass { 
    public SuperClass createSuperClass(object someParam) { 
     if (someParem == a) return new SubClassA(); 
     if (someParem == b) return new SubClassB(); 
    } 
} 

public class SubClassA extends SuperClass { 

} 

public class SubClassB extends SuperClass { 

} 

Как вы видите, вам нужен некоторый IF в каком-то месте ...

Смежные вопросы