Pir*_*ooz 1 java oop inheritance
假设我有一个Java包(.jar和源代码).以下是我想重用的一些类的定义.
abstract class Tree {
public abstract Tree[] children();
public void print();
}
class LabeledTree extends Tree implements Label {
Label label;
Tree[] daughterChildren;
public Tree[] children();
}
class Demo {
public static void main(String[] args) {
Parser p = new Parser();
String[] sent = { "This", "is", "an", "easy", "sentence", "." };
Tree parse = p.apply(sent);
parse.print();
}
}
Run Code Online (Sandbox Code Playgroud)
apply上面的方法返回一个LabeledTree.现在,我想创建我自己的树类型,例如MyTree,它具有以下结构.
class MyTree {
int value;
Label label;
public void myPrint();
}
Run Code Online (Sandbox Code Playgroud)
你在哪里建议我应该把这个类放在继承树中,以便我可以直接从apply方法实例化这个类的对象?您认为我应该如何设计我的系统以最大化软件重用,而不必解析每个树来构建对象MyTree?
几条评论:
首先,您的树定义公开了一个重要的细节 - 每个树对象都是一个节点.这创造了一大堆概念单元.在真正的API中,您将拥有一个Tree接口和一个使用Nodes的实现.所有数据成员都将在节点中,除了根节点,它将在您的TreeImpl中.
其次,我非常相信命名是良好和可读代码的关键第一步,并且它通常会影响您的OO设计的质量.树不应该简单地实现标签.你能说:"树是标签"吗?另一方面,如果你有类似的东西:"TreeNode实现HasLabel",它会更清楚 - "你的树节点有一个标签".
第三,您遇到了众所周知的一致性和差异的OOP问题.根据您当前的设计,标记树的根有一个标签,但较低的节点(简称为树)不一定是带标签的树.调试很有趣.泛型可以帮助您解决这个问题,但请务必阅读Effective Java以了解限制泛型类型的工作方式.