抽象类如何将子类作为成员的类型

想写一个List,其中Node的定义如下:

 public abstract class Node{
    public Node son=null;//为了测试方便,使用public
    //……还有好多
}

这样是想以后用的时候可以继承Node再添加实体。显然这么定义是不行的,因为以下代码可以通过:

A a=new A();//A extends Node
a.son=new B();//B extends Node

那么怎么定义呢?
PS:如果写成

 public class Node<T>{
    private Node son=null;
    private T t=null;
}

这样然后实体作为参数传给Node可以实现的这种事情我也是知道的。单纯是觉得不美丽。

1个回答

不知道你要表达什么意思。
son 定义为私有,定义公有的 getSon/setSon,那么子类重写 setSon() 可以对赋值的类型进行校验啊。
A 子类的 setSon 只接受 A 不接受 B(如果B没有继承A的话)。

Tiger_Zhao
Tiger_Zhao 回复baidu_28379135: 你的目的需要开发新语言来实现了,要用一个 ThisClass 之类的关键字来定义 son 变量。
大约 4 年之前 回复
baidu_28379135
baidu_28379135 回复Tiger_Zhao: 采纳了
大约 4 年之前 回复
baidu_28379135
baidu_28379135 ……我·提问·在·CSDN·不是·以·获得·解释·为·目的·而是·想·解决·问题……而且这么简单的事情我不可能不知道原因啊……好吧……就当是回答我“做不到”了
大约 4 年之前 回复
Tiger_Zhao
Tiger_Zhao 回复baidu_28379135: 而且不用泛型,Node的列表成员当然既可以是A也可以是B,它们都是Node啊。成员只能A的列表必须定义为A的列表,这不就是泛型的作用。解释很完美啊。
大约 4 年之前 回复
Tiger_Zhao
Tiger_Zhao 回复baidu_28379135: 父类要用一个尚未存在的类型(子类)去限定,除了泛型就只能通过编码约定来控制了。
大约 4 年之前 回复
baidu_28379135
baidu_28379135 重写是可以。但是父类不能强制子类去重写一个已经实现的方法,同时set方法不能是虚方法。如此这般……
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!