2014-02-21 94 views
0

目前我正在嘗試構建一個應用程序,它將在Processing中可視化xml樹。我對Processing很陌生(對於Java來說也是如此),並且在將我的想法變爲對象時遇到了一些問題。目前,我有一個Node類:處理中的OOP,我應該如何構建我的類?

class Node { 

//DATA 
color textColor; 
color boxColor; 
float xpos = width/2; 
float ypos = 100; 
float nodeWidth; 
float nodeHeight; 
boolean overBox = false; 
boolean active = false; 
PFont font; 

//CONSTRUCTOR 
Node(){ 
    textColor = color(0);//sets text color 
    boxColor = color(244);//sets box color 
    font = createFont("Gil Sans", 16, true); 
    textFont(font,50); 
    nodeWidth = textWidth("Modernism");//INPUT TEXT 
    nodeHeight = textAscent();//?textDescent()? 

    rectMode(RADIUS); 
} 

void displayText(){ 
    fill(textColor); 
    text("Modernism",xpos-nodeWidth/2,ypos+nodeHeight/2.3); 
} 

void displayBox(){ 
    //stroke(boxColor); 
    noStroke(); 
    noFill(); 
    rect(xpos, ypos, nodeWidth/2, nodeHeight/2); 

    //FOR DEBUGGING OVERBOX 
    //stroke(135); 
    //point(300,200); 
} 

void overBox(){ 
    if(mouseX > xpos-nodeWidth/2 && mouseX < xpos+nodeWidth/2 && 
    mouseY > ypos-nodeHeight/2 && mouseY < ypos+nodeHeight/2) { 
    overBox = true; 
    }else{ 
    overBox = false; 
    } 
} 

void clicked(){ 

    if(active) { 
    //If box was already clicked, trigger response 
    textColor = color(0); 
    overBox = false; 
    active = false; 
    } 

    if(overBox) { 
    //checks to see if click happened within bounds of box, makes active 
    textColor = color(100); 
    active = true; 
    } 
} 

    boolean activeCheck(){ 
    if(active == true){ 
    return true; 
    }else{ 
    return false; 
    } 
    } 

}

然後,我要的XML文檔的父母和孩子之間繪製的連接電纜:

class Connectors{ 
//DATA 
color lineColor; 
int lineWeight; 
int lineX1 = 12; 
int lineY1 = 155; 
int lineX2 = 12; 
int lineY2 = 475; 

//CONSTRUCTOR 
Connectors(){ 
    lineColor = color(0); 
    lineWeight = 2; 
} 

//FUNCTIONALITY 
void displayConnection(){ 
    stroke(lineColor); 
    strokeWeight(lineWeight); 
    line(lineX1,lineY1,lineX2,lineY2); 
} 
} 

這是非常粗糙的,但我想知道連接應該如何與節點相關聯。爲了建立連接,它需要知道父節點所在的位置。連接應該是它各自節點的子類嗎?

+0

子類=>「是一個」,就像「Car」類可能是「Vehicule」類的一個子類。 – 2014-02-21 19:56:12

回答

4

在這種情況下,您應該傾向於繼承aggregation。也就是說,Connector保留對兩個Node的引用。

public class Connector { 

    // other members 
    private Node firstNode; 
    private Node secondNode; 

    public Connector(Node firstNode, Node secondNode) { 
     this.firstNode = firstNode; 
     this.secondNode = secondNode; 
    } 

} 

現在Connector知道它連接兩個Node秒。

您要這樣做的原因是Node s和Connector s沒有太多共同之處。我們有如何將OOP關係翻譯成英文的約定。

  • 使用「是」來描述繼承。
  • 使用「有」來描述聚合和組成。

哪個更合理? 「ConnectorNode」或「ConnectorNode」?現在

,你可能想使一個抽象父類,甚至更好,接口,對於這ConnectorNode如果他們分享一些共同的東西,比如吸引他們的能力。

public interface MyDrawable { 

    /** 
    * Draw this object on the "processing" canvas 
    * note: 2rs2ts does not know anything about the "processing" library 
    */ 
    public void draw(); 

} 

// another file... 

public class Connector implements MyDrawable { 

    // all of the other stuff 

    public void draw() { 
     stroke(lineColor); 
     // etc. 
    } 
} 

繼承意味着您將父類的所有內容都拉入子類。 (這就是關鍵字extends的原因。)如果有關於Node的東西與Connector的東西完全分開,則不要從另一個繼承。如果你想獲得面向對象的抽象,把共同點分成一個接口或一個共同的父類。

+0

很好的答案,看起來像我需要的東西。感謝您的幫助,我很感激。 – aceslowman

0

我假設你想建立你的XML解析器或樹作爲練習,如果不使用一些Java庫來走xml樹。有很多庫可以做到這一點。

不要將連接表示爲Node的子類。連接不是節點。您可以將您的樹表示爲特殊圖形,節點是頂點,連接是邊緣。

您可以選擇使節點具有其他節點,並且這是一個連接。

喜歡這個

public class Node { 
    Node parent; 
    Node left; 
    Node right; 
    // Or if there is N Connections, or as we say in tree leafs 
    List<Node> connections; 
} 

然後你使用算法來走節點和顯示連接起始形式初始節點(頭),你可以使用列表或哈希表來表示你的樹節點的集合。如果你在計算機科學方面學習一點圖論或算法和結構數據,你可以做到這一點。

相關問題