2017-08-28 2 views
0
public class Node 
{ 
    Node next, child; 
    String data; 

    Node() 
    { 
     this(null); 
    } 

    Node(String s) 
    { 
     data = s; 
     next = child = null; 
    } 

    Node get(int n) 
    { 
     Node x = this; 
     for(int i=0; i<n; i++) 
      x = x.next; 
     return x; 
    } 

    int length() 
    { 
     int l; 
     Node x = this; 
     for(l=0; x!=null; l++) 
      x = x.next; 
     return l; 
    } 

    void concat(Node b) 
    { 
     Node a = this.get(this.length() - 1); 
     a.next = b; 
    } 

    void traverse() 
    { 
     Node x = this; 
     while(x!=null) 
     { 
      System.out.println(x.data); 
      x = x.next; 
     } 
    } 
} 

class IntegerNode extends Node 
{ 
    int data; 

    IntegerNode(int x) 
    { 
     super(); 
     data = x; 
    } 
} 

Est-il possible que je peux avoir différents types de data dans les deux classes afin que je puisse utiliser la classe IntegerNode avec les chiffres et la classe Node avec des chaînes?Différents types de données dans différentes classes

Exemple:

public class Test 
{ 
    public static void main(String args[]) 
    { 
     IntegerNode x = new IntegerNode(9); 
     IntegerNode y = new IntegerNode(10); 
     x.concat(y); 
     x.concat(new Node("End")); 
     x.traverse(); 
    } 
} 

En ce moment, c'est la sortie que je reçois: null null End

Toute explication aiderait. Merci d'avance.

Répondre

1

Le par défaut façon serait d'utiliser generics.

Comme:

public class Node <T> { 
    private final T data; 

    public Node(T data) { this.data = data; } 

à utiliser alors comme:

Node<Integer> intNode = new Node<>(5); 
Node<String> stringNode = new Node<>("five"); 

S'il vous plaît noter: le ci-dessus est de savoir comment vous résoudre ces problèmes en Java. Utiliser l'héritage ici serait une approche plutôt mauvaise. Sauf si vous voulez vraiment vraiment trouver une bonne raison pour être concat() nœuds avec différentes données. Comme ma solution "sépare" complètement un Node<Integer> forme un Node<String>. Et oui, cela signifie que les utilisateurs peuvent créer des objets Node<Whatever> à tout moment.

Ainsi: si vous voulez vraiment seulement entiers et les noeuds de données String - alors vous feriez en fait ce qui suit:

  • rendre les données de maintien base de classe Node Object
  • faire la classe de base abstraite
  • créer deux sous-classes spécifiques pour Integer/String, comme indiqué dans l'autre réponse

Mais le Qué Stion serait: ce qui se passe quand vous décidez la semaine prochaine que vous voulez Float et Double, aussi. Et peut-être des dates? Ensuite, vous devrez créer de nouvelles sous-classes à chaque fois. Conduisant à beaucoup de code dupliqué.

Donc, le réel répondre ici: vraiment pensez vos exigences à travers. Comprenez ce que vous voulez exactement construire. Et puis voyez quel chemin vous devriez prendre.

+0

Je suis d'accord que c'est une meilleure approche, mais cela ne permettrait pas à l'utilisateur de choisir des types de données au-delà de l'entier et de la chaîne? – Nerzid

+0

Oui Oui, mais vous pourriez fournir des implémentations concrètes pour les entiers et les chaînes, si ce sont les 2 seules que vous voulez utiliser. D'ailleurs, le nom propre à * generics * est «types paramétrés». – vikingsteve

+1

Merci. Génériques était ce que je cherchais – RJacob41