Скажите, что у вас есть класс Население и население составляют внутренний список лиц. Пользователь хочет передать незавершенный индивидуальный подкласс Population и позволить Population выполнять работу по их созданию, независимо от того, какой подкласс был передан.Как разрешить классу создавать другие классы, когда эти другие классы передаются пользователем?
public class Population{
private List<Individual> indiList = new ArrayList(25);
/*I know this won't work for multiple reasons, but shows the idea*/
public void addIndividualsOfType(Individual individual){
for (ListIterator it = indiList.listIterator(); it.hasNext();){
it.next()
it.add(individual.construct(param1, param2, param3);
}
}
}
public abstract class Individual{
SomeType param1;
...
public Individual(SomeType param1, SomeType param2, SomeType param3){
this.param1 = param1;
...
}
}
public class HappyIndividual extends Individual{
...
}
public class SadIndividual extends Individual{
...
}
Я хотел бы быть в состоянии сделать вызов, как population.addIndividualsOfType(HappyIndividual)
Очевидно, что этот код не будет работать по многим причинам (например, пропускание uninstantiated класса). Я просто пытаюсь проиллюстрировать идею того, что я хочу делать, это не вопрос о том, почему приведенный выше код не работает. Я знаю, что это не сработает, поэтому я не могу понять, как это можно сделать.
Я весь день занимаюсь строителями и статическими фабричными методами. Проблема в том, что мы говорим о подклассах здесь. Подклассы не очень хорошо работают со Static. Если я дам Индивидуальному статическому заводскому методу, я в конечном итоге создаю Индивидуумов, а не Счастливых Индивидуумов. Аналогичные проблемы возникают с Builder. Я также хочу, чтобы это не было слишком сложным.
Я чувствую, что это должно быть очень легко, но у меня проблемы. Благодарю.
Я знаю, что фабрики рекомендуются для отражения. Зачем? –
@Ben B - фабрики более надежны, чем решение на основе отражения, поскольку они статически проверяются по типу. Если есть ошибки, связанные с типом, они, вероятно, будут собраны во время компиляции. Отражение также происходит медленнее, поскольку проверка типов выполняется повторно во время выполнения, а не один раз во время компиляции. –
В коде есть что-то очень неправильное. Я думаю, что у меня есть то, что вы пытались написать ... но вы можете это очистить. –