2012-12-19 3 views
6

J'ai une classe A concrète qui implémente une B. interfaceAucune méthode setter dans l'interface

B ref = new A(); 

code:

public interface B{ 
    public abstract String[] getWords(); 
} 

public class A implements B { 
    private String[] words = new String[] {}; 
    public void setWords(String[] words){ 
    this.words = words; 
    } 
    public String[] getWords(){ 
    return this.words; 
    } 
} 

Dans le B d'interface, je n'ai getter mais pas méthode setter si la classe A l'a. Donc quand je fais ceci: B ref = new A();, ce code fonctionnera-t-il et comment vais-je définir les mots?

Répondre

4

Vous avez à jeter de nouveau le type d'origine si l'interface ne l'exposez pas

if (ref instanceof A) 
    ((A) ref).setWords(words); 
else 
    // something else. 

Une meilleure solution est d'ajouter la méthode à l'interface.

5

Vous ne serez pas en mesure d'appeler setWords sur ref s'il est défini comme B ref = ....

Ceci est l'un des cas où vous avez besoin d'utiliser le type exact en déclarant la variable (ou utiliser un cast):

A ref = new A(); 

Autre possibilité:

  • vous pouvez créer une interface C cela étend B et contient les deux méthodes et A A mettre en œuvre C.
  • vous pourriez fournir un constructeur dans A qui prend un String[] words argument pour initialiser votre champ words, et ne pas fournir un setter à al l.

Personnellement, je favorise cette dernière option:

public class A implements B { 

    private final String[] words; 

    public A(String[] words) { 
     this.words = words; 
    } 

    public String[] getWords() { 
     return this.words; 
    } 
} 
+0

Merci à tous pour les réponses. – Mercenary

5

Alors, quand je le fais: B ref = new A() ;, cela fonctionnera de code ...

Oui, ce sera le cas.

... et comment vais-je définir des mots?

Vous ne serez pas en mesure de moins que vous:

  1. marque constructeur de A prendre la liste des mots; ou
  2. ajouter setWords() à B; ou
  3. conservez une référence de type A à votre objet; ou
  4. dégradé ref à A.

Parmi ceux-ci, j'irais avec l'une des options 1-3. La dernière option est seulement incluse pour l'exhaustivité.

3
B ref = new A();//1 
ref.setWords(whatever);//2 

Le code ci-dessus ne serait pas compiler comme setWords() n'est pas défini dans votre interface B, vous obtiendrez une erreur de compilation sur la ligne 2.

que d'autres ont déjà exprimé dans leurs réponses.vous avez 2 options comme solution de contournement

  • Créer l'objet comme A ref = A();
  • Diminuer la référence à un type comme ((A) ref) .setWords (watever);
0

Alors, quand je le fais: B ref = new A() ;, cela fonctionnera de code

Oui

et comment vais-je mettre des mots?

Vous ne pouvez pas. Vous devez avoir une méthode setter dans votre interface.

Entre vous n'avez pas besoin de définir la méthode comme abstraite. C'est par défaut abstrait.