Polimorfismo

Como fazer para evitar o uso de if na seguinte situação:

ClassePai p = new ClasseFilha1();

Eu tenho várias classes filhas e dependendo de determinada condição devo instanciar a ClasseFilha1 ou ClasseFilha2 ou …

Quero evitar isso:

if(var.equals("um"){
     ClassePai = new ClasseFilha1();
}
if(var.equals("dois"){
     ClassePai = new ClasseFilha2();
}

Nao tem muito como fugir disso. Agora, se vc tiver uma quantidade absurda de possibilidades, da para automatizar um pouco usando reflection. Ficaria algo assim:

Map m = new HashMap() {{
    put("um", "ClasseFilha1");
    put("dois", "ClasseFilha2");
    put("tres", "ClasseFilha3");
    put("quatro", "ClasseFilha4");
}};

ClassePai p = (ClassPai)Class.forName((String)m.get(var)).newInstance();

Rafael

estrutura de repetição multipla (switch).

Um exemplo:

switch (escolha);
case 1:  
ClassePai = new ClasseFilha1();
break;
default:
ClassePai = new ClasseFilha2();

Pode ser que sirva, dependendo da situação!

De qualquer forma, não tem como criar novas classes filhas sem alteração de código em outra classe. Certo?

[quote=Rafael Steil]Nao tem muito como fugir disso. Agora, se vc tiver uma quantidade absurda de possibilidades, da para automatizar um pouco usando reflection. Ficaria algo assim:

Map m = new HashMap() {{
    put("um", "ClasseFilha1");
    put("dois", "ClasseFilha2");
    put("tres", "ClasseFilha3");
    put("quatro", "ClasseFilha4");
}};

ClassePai p = (ClassPai)Class.forName((String)m.get(var)).newInstance();

Rafael[/quote]

Liskov Substitution Principle.

http://c2.com/cgi/wiki?LiskovSubstitutionPrinciple

Toda classe filha serve no lugar da classe mae em qualquer situaçao.

Concordo plenamente com vc. A minha questão é que no momento da instanciação, é necessário saber qual classe filha instanciar e isso provavelmente vai gerar códigos com if.

Depende exatamente do contexto, mas nem semrpe você consegue evitar condicionais deste tipo, se for o caso, tenha certeza que apenas uma classe tem esse if, ou seja: que esta decisão só é tomada por um componente.