处理中的OOP,我应该如何构建我的类?

时间:2014-02-21 19:48:09

标签: java class oop subclass processing

目前我正在尝试构建一个可视化处理中的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);
}
}

这一切都非常粗糙,但我想知道连接应该如何与节点相关联。要构建连接,需要知道它的父节点所在的位置。连接应该是它的相应节点的子类吗?

2 个答案:

答案 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

您希望这样做的原因是NodeConnector不共享很多共同点。我们有关于如何将OOP关系翻译成英语的惯例。

  • 使用“is a”来描述继承。
  • 使用“has a”来描述聚合和组合。

哪个更有意义? “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 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理论或算法和结构数据,你就可以做到这一点。