【发布时间】:2016-10-17 17:12:19
【问题描述】:
我正在创建一个 Node 类,用于两种相似但根本不同的算法。在它们之间有一些共同的功能,我的想法是创建一个具有共享方法和字段的抽象节点类。从这个抽象类扩展两个具体的子类 WaveNode 和 EchoNode。
抽象类中的一些方法处理节点的实例,但我想将这个公共代码与子类的实例一起使用,也就是说,如果你给方法一个 WaveNode 或一个 EchoNode,那么这个方法就不需要了不同的实现。所以我认为最好在抽象类中实现它,并且两个子类都可以使用该实现,所以我不必输入两次。但是,当我在我的子类中并且我正在处理 WaveNode 或 EchoNode 时,我会遇到编译错误,因为该方法需要一个抽象 Node 实例。有没有办法在超类中实现方法,并且扩展超类的不同类可以使用它的实现。
下面是一个例子。
Set<Node> getNeighs(){
Set<Node> nei = (Set<Node>) rec.keySet();
nei.remove(this);
return nei;
}
此代码采用映射“rec”并将(节点的)键集放入节点集。删除当前节点并返回其所有邻居。因此 WaveNode 和 EchoNode 都使用完全相同的代码。唯一不同的是 Set 是 WaveNode 或 EchoNode。我想在超类中用 Node 来实现它,以节省我写两次的时间。有可能吗?
编辑
发布更多代码:
public abstract class Node {
private final int id;
Map<Node, Boolean> rec = new HashMap<Node, Boolean>();
public Node(int id) {
this.id = id;
}
int getId() {
return id;
}
void addNeigh(Node neigh) {
rec.put(neigh, false);
}
Set<Node> getNeighs() {
Set<Node> nei = (Set<Node>) rec.keySet();
nei.remove(this);
return nei;
}
void printNeighbours() {
Set<Node> nei = getNeighs();
System.out.println(this +" neighbours are: " + nei);
}
Node getSilentNeigh() {
for(Entry<Node, Boolean> entry : rec.entrySet())
{
if(!entry.getValue())
return entry.getKey();
}
return null;
}
public final class TreeNode extends Node {
boolean messageSent = false;
public TreeNode(int id){
super(id);
}
public void sendTok(TreeNode sender){
rec.put(sender, true);
}
请注意,我现在让它按预期工作,没有将 Node 的返回类型转换为 TreeNode 是我自己的错。但是,欢迎对我的代码“做太多”的任何 cmets 或关于清理我的代码的类似建议。谢谢
【问题讨论】:
-
您能否发布所有实际代码(删除不相关的部分)以及错误消息
-
不过,您展示的方法不带参数。它如何接受
rec? -
我认为你想要的是在抽象类上使用某种类型(即
EchoNode extends AbstractXXX<EchoNode>),但我不确定 -
对不起,我只需要将返回 Node 的方法的返回类型转换为 TreeNode。我认为这很危险,因为您应该尽量避免放弃,但它似乎有效并且没有给我错误。我目前正在学习继承,所以可能是一个菜鸟错误。谢谢
标签: java inheritance polymorphism abstract-class