gpt4 book ai didi

Java继承抽象类

转载 作者:行者123 更新时间:2023-12-01 09:22:21 25 4
gpt4 key购买 nike

我正在创建一个 Node 类,用于两个相似但根本不同的算法。它们之间有一些共同的功能,我的想法是创建一个具有共享方法和字段的抽象节点类。从这个抽象类扩展两个具体子类:WaveNode 和 EchoNode。

抽象类中的一些方法处理 Node 的实例,但我想将这个通用代码与子类的实例一起使用,也就是说,如果您为该方法提供 WaveNode 或 EchoNode 那么该方法不需要不同的实现。所以我认为最好在抽象类中实现它,并且两个子类都可以使用该实现,这样我就不必输入两次。但是,当我在子类中处理 WaveNode 或 EchoNode 时,我会收到编译错误,因为该方法需要一个抽象 Node 实例。有没有办法在父类(super class)中实现方法,并且扩展父类(super class)的不同类可以使用其实现。

下面是一个示例。

Set<Node> getNeighs(){
Set<Node> nei = (Set<Node>) rec.keySet();
nei.remove(this);
return nei;
}

此代码采用映射“rec”并将(节点的)键集放入节点集中。删除当前节点并返回其所有邻居。所以 WaveNode 和 EchoNode 使用完全相同的代码。唯一的不同是 Set 是 WaveNode 或 EchoNode。我想用父类(super class)中的 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。然而,任何对我的代码“做得太多”的评论或关于清理我的代码的类似建议都是受欢迎的。谢谢

最佳答案

使用泛型来执行此操作,而不是在 Node 上专门键入。将返回签名从 Set<Node> 更改为至Set<? extends Node>或者让子类处理泛型类型而不是其类型。

关于Java继承抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40092078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com