Ya hay varios SO preguntas sobre por qué no hay método/campo estático abstracta como tal, pero me pregunto acerca de cómo se podría ir sobre la aplicación de la siguiente pseudo-código:Método "Resumen estático": ¿cómo?
class Animal {
abstract static int getNumberOfLegs(); // not possible
}
class Chicken inherits Animal {
static int getNumberOfLegs() { return 2; }
class Dog inherits Animal {
static int getNumberOfLegs() { return 4; }
Aquí es el problema : Asumiendo que quiero asegurarse de que cada clase que hereda Animal
para contener getNumberOfLegs()
método (es decir, casi como una interfaz, excepto sí quiero la clase abstracta para implementar varios métodos que son comunes a todas las clases hijas, por lo tanto, la interfaz pura no funciona aquí) getNumberOfLegs()
, obviamente, debe haber un método estático (suponiendo que en un mundo perfecto 'no tiene pollo y perros, así getNumberOfLegs
no es instancia dependiente paralizado).
Sin un método/campo "abstracto estático", uno puede dejar el método fuera de la clase Animal
, entonces existe el riesgo de que algunas clases secundarias no tengan ese método. O uno puede hacer que getNumberOfLegs
sea un método de instancia, pero luego tendría que instanciar una clase para averiguar cuántas patas tiene ese animal, aunque no sea necesario.
¿Cómo se suele ir sobre la implementación de esta situación?
EDITAR: Aquí cómo podría utilizar esto. Asumir (ahora esto es ridículo, pero de todos modos ...) que el número de patas de cada animal es único, por lo que podría tener algo como:
Animal getModelAnimal(int numberOfLegs) {
if (numberOfLegs == Chicken.getNumberOfLegs()) return new Chicken();
else if (numberOfLegs == Dog.getNumberOfLegs()) return new Dog();
}
-1: No se puede decir que en general. el método abstracto no siempre es sin sentido (ver mi publicación). – Simon
Edité mi respuesta para reflejar esto. –
Mi pregunta está destinada a ser independiente del lenguaje (me encontré con un problema similar en C# antes). Puedo ver por qué no hay un modificador "estático abstracto" en un idioma, pero estoy más interesado en ver cómo se puede implementar limpiamente el problema que planteé en la pregunta. – polyglot