2017-08-28 70 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; 
    } 
} 

有什麼辦法,我可以有不同類型的data兩個類,這樣我就可以使用IntegerNode類號和Node類的字符串?不同類型的數據在不同的班級

例子:

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(); 
    } 
} 

現在,這是我得到的輸出: null null End

任何解釋會有所幫助。先謝謝你。

回答

1

默認方式是使用generics

像:

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

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

到然後使用類似:

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

請注意:以上的是怎麼解決在Java中這樣的問題。在這裏使用繼承將是一個相當錯誤的方法。除非你會真的找到一個很好的理由能夠concat()節點與不同數據。由於我的解決方案完全「分離」了Node<Integer>,因此形成了Node<String>。是的,這意味着用戶可以在任何時候創建Node<Whatever>對象。

這樣:如果你真的想整數和字符串數據節點 - 那麼你實際上做到以下幾點:

  • 製造基地Node類保持數據爲Object
  • 使基類的抽象
  • 創建整數/字符串兩個具體子類,如其他答案

但闕概述stion會是:當你下週決定你想要Float和Double時會發生什麼。也許日期?然後你必須每次創建新的子類。導致許多重複的代碼。

所以這裏的真正回答:真的認爲您的要求通過。瞭解你想要建立的是什麼。然後看看你應該走哪條路。

+0

我同意這是一個更好的方法,但不會讓用戶選擇超出整數和字符串的數據類型嗎? – Nerzid

+0

是的確如此,但您可以提供整數和字符串的具體實現,如果這些是您想要使用的唯一2個。順便說一下,* generics *的專有名稱是'參數化類型'。 – vikingsteve

+1

謝謝。泛型是我在找的 – RJacob41