¿Cómo se trata de tener solo una herencia única en Java? Aquí está mi problema específico:Problema de diseño de herencia múltiple en Java
tengo tres clases (simplificado):
public abstract class AbstractWord{
String kind; // eg noun, verb, etc
public String getKind(){ return kind; }
}
public class Word extends AbstractWord{
public final String word;
ctor...
public void setKind(){
// based on the variable word calculate kind..
}
}
public class WordDescriptor extends AbstractWord{
ctor..
public void setKind(String kind){this.kind = kind;}
}
Esto es lo que considero mi aplicación más básica, pero quiero hacer otras implementaciones.
Digamos que quiero agregar una nueva variable, digamos wordLength, pero quiero agregarla usando la herencia. Lo que significa que NO quiero modificar esa clase original de AbstractWord. Es decir, algo a lo largo de las líneas de esto:
public class Length{
private int length;
public int getLength(){return length};
}
public class BetterWord extends AbstractWord AND Length{
public void setLength(){
// based on the variable word calculate Length..
}
}
public class BetterWordDescriptor extends AbstractWord AND length{
public void setLength(int length){this.length = length;}
}
sé que Java no me deja hacer esto, pero ha hecho mi código muy feo. En este momento cada vez que agrego un campo, simplemente lo agrego a AbstractWord, pero luego necesito cambiar el nombre de AbstractWord (y Word y WordDescriptor). (No puedo simplemente agregar el campo al otro debido a la compatibilidad con versiones anteriores, es igual a métodos y cosas por el estilo).
Esto parece ser un problema de diseño muy común, pero me he dado cuenta y no puedo encontrar ninguna solución hermosa.
¿Hay algún patrón de diseño que solucione esto? Tengo algunas soluciones potenciales, pero quería ver si había algo que me faltaba.
gracias, Jake
Actualización: La longitud se refiere al número de sílabas de la palabra (lo siento por la falta de claridad)
¿El 'Length' tiene que ser básico una clase en lugar de una interfaz? –
@Loadmaster: Length es una clase y no una interfaz, por lo que no es necesario duplicar los métodos de longitud en Word y WordDescriptor. Por longitud, estos métodos son simples pero para otras cosas podrían ser muy complejos. – sixtyfootersdude
@Jake: Si otras cosas pueden ser muy complejas, definitivamente debe usar "Patrón de estrategia". –