2016-07-28 28 views
0

Es gibt ein Problem, mit dem ich konfrontiert bin, und ich kenne die technischen Begriffe nicht, um es zu beschreiben. Daher war es schwierig für mich zu suchen eine Antwort selbst und ich hoffe, dass jemand in der Lage ist, etwas Licht zu werfen, was hier vor sich geht.Vermeidung einer doppelten Methodendefinition in 2+ ähnlichen untergeordneten Klassen innerhalb einer Java-Bibliothek

Nehmen wir an, eine Bibliothek hat 2 oder mehr ähnliche Klassen mit ähnlichen Funktionen wie JTextField und JTextArea. Ich möchte diesen beiden Klassen eine zusätzliche Methode zur Verfügung stellen.

Ich könnte beide Klassen erweitern und die Methode zu jedem hinzufügen, aber die hinzuzufügende Methode könnte so ähnlich sein, dass sie in jede Klasse kopiert und eingefügt werden könnte. Das lässt mich denken, dass es einen besseren Weg gibt, dies zu tun.

In diesem vereinfachten Beispiel ist es möglich: A) in der Nähe der doppelten Definition von „GetStringValue()“ zwischen CustomJTextField und CustomJTextArea während B) Beibehaltung der ursprünglichen Funktionalität von JTextArea und JTextField eliminieren.

CONCEPTUAL Beispiel:

public interface AnInterface { 
    public String getStringValue(); 
} 

public class CustomJTextField implements AnInterface{ 
    //Could Duplication of this method be avoided? 
    @Override 
    public String getStringValue(){ 
     return this.getText(); 
    } 
} 

public class CustomJTextArea implements AnInterface{ 
    //Mirrors CustomJTextField's definition 
    @Override 
    public String getStringValue(){ 
     return this.getText(); 
    } 
} 

public class CustomJCheckbox implements AnInterface{ 
    @Override 
    public String getStringValue(){ 
     return this.isSelected() ? "Checked" : "Not Checked"; 
    } 
} 

public class Main{ 
    public static void main(String[] args) { 
     ArrayList<AnInterface> items = new ArrayList<AnInterface>(); 
     items.add(new CustomJTextField()); 
     items.add(new CustomJTextArea()); 
     items.add(new CustomJCheckbox()); 

     for (AnInterface item : items){ 
      String output = item.getStringValue(); 
      System.out.println(output); 
     } 
    } 
} 

Meine Frustration war, dass ich nicht nur scheinen kann JTextComponent zu erweitern, ohne die Funktionalität von JTextField und JTextArea zu verlieren, aber wenn beide verlängert werden, fühlt es sich wie unnötige Duplizierung. Gibt es eine elegante Möglichkeit, diese Art von Duplizierung zu vermeiden?

Antwort

1

Wenn Sie Java 8 verwenden, bieten default Methodenimplementierungen in interface Definitionen, bieten eine gute Lösung.

In dem obigen Beispiel können Sie AnInterface als

public interface AnInterface { 
    public getText(); // Abstract method (re)definition 

    default String getStringValue() { 
     return this.getText(); 
    } 
} 

und nur überschreiben die getStringValue() Methode für die CustomJCheckbox Klasse definieren.

Natürlich ist das Obige von geringem Wert für Verfahren mit trivialen (z. B. 1-Linien) Implementierungen. Es ist jedoch sehr nützlich für mpore komplexe Methoden.

+0

Danke schön! – Zachary

+0

Sie sind herzlich willkommen. :-) – PNS