如果是贪吃蛇,一个比较正常的设计是用:
List<Point>
然后具体画图时再考虑形状。事实上你应该是将一个画好的圆或者方的图片拷贝到不同的点上。
另一种设计是允许一条蛇上有不同形状,那么List<Shape>是可以。
但是添加新结点的函数应该是直接给出建好的子类对象而不是在函数时生成对象。
【 在 tortelee (hust-wh) 的大作中提到: 】
: 标 题: Re: ArrayList<Shape> 里add new object
: 发信站: 水木社区 (Tue Jul 13 20:11:24 2021), 站内
:
:
* 子类对象is-a关系概念错误
: Class c = list.get(0).getClass(); (1)
: Shape s = (Shape) c.newInstance(); (2)
: 你这样得到的是一个c对应的对象而不是Shape对象。事实上Shape可以是抽象类。
: Cicle is a Shape
: 你拿到的就是Circle对象: ============================
:
:
第二步,初始的目的是为了获得c new出的对象引用,然后加到list中。 在不清楚,c具体类型的情况下,
: 貌似只能这样获得这个引用吧。
: Q: shape如果是抽象类,会怎么样?:
:
:
* 容易出错的设计
: newInstance()调用的是无参构造。如果某个子类定义的构造函数有参数那么就会出错
: List<Shape里可以有多个不同的子类。你的实现默认就只考虑了第一个。
: ============================:
:
嗯,这点赞同:
:
: * 范型错误
: 如果你手头的对象是List<Circle>,那你是不能将它作为一个List<Shape>传递的。
: 你需要将型参声明为List<? extends Shape>
: ===========================
:
手头的对象,可能是List<Circle> 或者 List<Rectangle> 。 我是想做个贪吃蛇,蛇的基本单元可能是圆形,也可能是矩阵。所以就这么写了。
: 那就用List<? extends Shape> ?:
: 谢谢啦
:
: 【 在 here080 的大作中提到: 】
: : 槽点过于密集,我一个一个说:
: : * 子类对象is-a关系概念错误
: : Class c = list.get(0).getClass();
: : ...................
:
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 223.166.166.*]
--
FROM 76.126.252.*