2012-12-01 15 views
7

Angenommen, ich habe eine Schnittstelle und viele Klassen, die diese Schnittstelle implementieren. Ich möchte das Überschreiben der Standardimplementierung von toString() in jeder dieser Klassen erzwingen (das heißt, wenn einige Klassen es nicht überschreiben, sollte das zu einem Kompilierungsfehler führen).Wie kann sichergestellt werden, dass die Methode toString() in der Klasse neu implementiert wird?

Ist das möglich? Das Deklarieren von public abstract String toString(); mit oder ohne die Annotation @Override im Schnittstellenkörper ist zulässig, hat jedoch keine Auswirkungen.

Antwort

2

Schreiben Sie einen Annotations- und Annotationsprozessor und verwenden Sie ihn während der Kompilierung.

Ihre Anmerkung wird wie folgt aussehen:

public @ interface MustOverrideToString { } 

und Annotations-Prozessor wird für jede Klasse aussehen, dass

  1. eine Klasse mit der MustOverrideToString Anmerkung erstreckt
  2. nicht toString
außer Kraft setzen
+0

Das scheint eine Menge Arbeit zu sein, aber cool! – chessofnerd

14

Yup, Art von.

protected abstract String internToString(); 

und dann

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

in Ihrer Basisklasse.

+1

klug, aber dies scheint nach dem ersten abgeleiteten Klasse wird nicht mehr funktionieren implementiert 'internToString()' - es ist Nachkommen brauchen, um es nicht neu zu implementieren. –

+0

@VictorSorokin Mit A) Original, B) Child Klasse, und C) Granchild Klasse, gibt es 3 Möglichkeiten: C implementiert nicht 'toString()', wodurch B's toString() 'aufgerufen werden kann, was A's toString ist() ', die B 'internToString()' aufruft. C überschreibt 'toString()' und gibt seine eigene Implementierung zurück. C überschreibt 'toString()' und ruft 'super(). ToString()' auf, das Bs aufruft, die A's aufrufen, die Bs 'internToString() 'aufrufen. Ich glaube, dass dies das Ziel erreicht, es sei denn, ich irre mich in irgendeiner Reihenfolge. – Izkata

+0

Ihre Lösung erfordert das Erstellen einer zusätzlichen abstrakten Klasse, und jede der Klassen, die die Schnittstelle implementieren, erweitern diese abstrakte Klasse, ist das korrekt? – k29

1

Ich denke, Sie müssen nichts als die Implementierung der Methode toString() in die spezifische Klasse deklarieren.

+0

Die Frage ist, was kann die Elternklasse tun, um die neue Klasse dazu zu zwingen? – Izkata

0

Wenn Sie abstract cl erstellen ass Sie nicht eine andere Methode benötigen:

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

... 

public class Sub extends Base{} //will not compile 
Verwandte Themen