Ci sono già diversi SO domande sul perché non v'è il metodo/campo statico astratto come tale, ma mi chiedo su come si potrebbe fare per attuare il seguente pseudo-codice:Metodo "Abstract static": come?
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; }
Qui è il problema : Supponendo che voglio assicurarmi che ogni classe che eredita contenga il metodo getNumberOfLegs()
(cioè quasi come un'interfaccia, eccetto che io voglio che la classe astratta implementa diversi metodi comuni a tutte le classi figlie, quindi l'interfaccia pura non funziona qui). getNumberOfLegs()
ovviamente dovrebbe essere un metodo statico (supponendo che in un mondo perfetto non abbiamo pollo e cani azzoppati quindi getNumberOfLegs
non dipende dall'istanza).
Senza un metodo/campo "statico astratto", è possibile lasciare il metodo fuori dalla classe Animal
, quindi esiste il rischio che alcune classi figlio non dispongano di tale metodo. Oppure si può fare di un metodo di istanza getNumberOfLegs
, ma poi si dovrebbe istanziare una classe per scoprire quante zampe ha quell'animale, anche se non è necessario.
Come si fa di solito per implementare questa situazione?
EDIT: Ecco come potrei usare questa. Supponiamo (ora questo è ridicolo, ma comunque ...) che il numero di gambe di ogni animale è unico, quindi potrei avere qualcosa di simile:
Animal getModelAnimal(int numberOfLegs) {
if (numberOfLegs == Chicken.getNumberOfLegs()) return new Chicken();
else if (numberOfLegs == Dog.getNumberOfLegs()) return new Dog();
}
-1: Non si può dire questo in generale. il metodo astratto non è sempre privo di senso (vedi il mio post). – Simon
Modificato la mia risposta per riflettere questo. –
La mia domanda è intesa come indipendente dalla lingua (ho incontrato un problema simile in C# prima). Posso capire perché non c'è un modificatore "statico astratto" in una lingua, ma sono più interessato a vedere come si può implementare in modo pulito il problema che ho affermato nella domanda. – polyglot