目前我正在尝试构建一个可视化处理中的xml树的应用程序。我是Processing(和Java)的新手,我在将想法变成对象时遇到了一些问题。目前我有一个Node类:
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 :(得分: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
和Connector
不共享很多共同点。我们有关于如何将OOP关系翻译成英语的惯例。
哪个更有意义? “Connector
是Node
,”或“Connector
有Node
”?
现在,您可能希望为Connector
和Node
创建一个抽象父类,甚至更好的界面,如果它们共享一些共同的东西,例如能够吸引他们。
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
s的内容完全分开,则没有一个继承自另一个。{1}}。如果您确实希望获得OOP抽象,请将共性分为接口或公共父类。
答案 1 :(得分: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;
}
然后使用算法遍历节点并显示从初始节点(标题)开始的连接,您可以使用list或hashtables将树表示为节点集合。如果你在计算机科学中学习一点Graph理论或算法和结构数据,你就可以做到这一点。