2012-12-01 20 views
7

Supponiamo di avere un'interfaccia e molte classi che implementano tale interfaccia. Voglio applicare l'override dell'implementazione predefinita di toString() in ciascuna di queste classi (ovvero, se alcune classi non la sovrascrivono, ciò dovrebbe comportare un errore di compilazione).Come garantire che il metodo toString() sia reimplementato in classe?

È possibile raggiungerlo? La dichiarazione public abstract String toString();, con o senza l'annotazione @Override, nel corpo dell'interfaccia, è legale, ma non ha alcun effetto.

risposta

2

Scrivere un processore di annotazione e annotazione e utilizzarlo durante la compilazione.

l'annotazione sarà simile:

public @ interface MustOverrideToString { } 

e il processore di annotazione cercherà qualsiasi classe che

  1. estende una classe con l'annotazione MustOverrideToString
  2. non sovrascrive toString
+0

Questo sembra un sacco di lavoro, ma fantastico! – chessofnerd

14

Sì, tipo di.

protected abstract String internToString(); 

e poi

@Override 
public String toString() { 
return internToString(); 
} 

nella classe base.

+1

intelligente, ma sembra che questo smetterà di funzionare dopo la prima classe derivata implementa 'internToString()' - è discendenti non avranno bisogno di ri-attuazione. –

+0

@VictorSorokin Con A) Originale, B) Classe figlio e C) Classe Granchild, ci sono 3 possibilità: C non implementa 'toString()', che consente a B's 'toString()' di essere chiamato, che è A 'toString() ', che chiama B' internToString() '. C sovrascrive 'toString()' e restituisce la propria implementazione. C sovrascrive 'toString()' e chiama 'super(). ToString()', che chiama B's che chiama A's che chiama 'internToString()'. Credo che questo raggiunga l'obiettivo, a meno che non mi sbagli su un ordine di chiamata. – Izkata

+0

La tua soluzione richiede la creazione di una classe astratta in più, e rendendo ognuna delle classi che implementano l'interfaccia estendere quella classe astratta, è corretto? – k29

1

Penso che non sia necessario dichiarare altro che l'implementazione del metodo toString() nella classe specifica.

+0

La domanda è: cosa può fare la classe genitore per forzare la nuova classe a farlo? – Izkata

0

Se si crea abstract cl ass non avete bisogno di un altro metodo:

public abstract class Base{ 
    public abstract String toString(); 
} 

... 

public class Sub extends Base{} //will not compile 
Problemi correlati