如果我有这种情况:
interface Node {}
class EmptyNode implements Node {}
class NotEmptyNode implements Node {}
现在我有另一个班,
class List {
Node n;
}
我尝试做的是找到一种方法来确定获取节点列表大小的方法。我已经有了逻辑:
public int getSize(Node start) {
if (start==EmptyNode) { //Can't do this, not sure how to check if its an empty Node
return 0;
}
else {
return 1 + getSize(start.next()); //Want to add 1 and move to next Node
}
}
由于EmptyNode和NotEmptyNode都是Node的类型,我知道我需要实现一个我可以在接口中编写的函数,该函数将在两个类中实现,并且能够计算列表末尾的时间击中。
答案 0 :(得分:7)
您正在使用此处的实例。这意味着您可以在节点接口中放置isEmpty()
方法,并使用它来检查节点是否为空。
interface Node {
boolean isEmpty();
}
class EmptyNode implments Node {
@Override
public boolean isEmpty() { return true; }
}
class NotEmptyNode implements Node {
@Override
public boolean isEmpty() { return false; }
}
...
public int getSize(Node start) {
if (start.isEmpty()) {
...
}
else {
...
}
}
另一种解决方案是让Node
实现size()
功能:
interface Node {
int size();
Node next();
}
class EmptyNode implements Node {
@Overide
public int size() {
return 0;
}
...
}
class NotEmptyNode implements Node {
@Overide
public int size() {
return 1 + next().size();
}
...
}
...
class List {
Node n;
public int getSize() {
return n.size();
}
}
摆脱了if
语句altogother。