【发布时间】:2015-03-09 07:41:19
【问题描述】:
我想将 Pattern Decorator 应用到我的 Android 项目中,但在装饰器中我失去了一个对象的成员资格到他的类。例如,如果我想在我的 Level 中添加一个 Ball,我的装饰器 ColRebondBord 中的处理将应用于 AbstractGameObject 不是球。所以我不知道我的对象是球还是墙。 (一个是圆形,一个是矩形)
在 Level.java 中:
AbstractGameObject ball = new Ball (sizeball, posX, posY);
ball = new ColRebondBord(ball);//ball will rebond on the border level(screen)
lvl.add(ball);//add the ball in the Level
在 ColRebondBord.java 中:
public void collisionBorder(double xLeftTopCorner, double yLeftTopCorner, double width, double height)
{
if(_GameObjectDecorated instanceof Ball) {
//treatments for Ball Object but never comes here
}
if(_GameObjectDecorated instanceof Wall) {
//treatments for Wall Object but never comes here
}
这是在collisionBorder中截取一个断点,我以为它会在第一个IF中出现,但是没有:
有人知道我是否必须使用多态(所以在这种情况下,我必须为每个对象 Ball 和 Wall 做装饰器)或其他想法?
---编辑--- 阅读 cmets,有 2 个解决方案:(感谢 @GuillaumeS 和 @amdev)
- ColRebondBord 的 2 个子类:ColRebondBordBall 和 ColRebondBordWall
- 做 2 个装饰器,一个用来装饰球,另一个用来装饰墙
也许可以提出其他建议
【问题讨论】:
-
GameObjectDecorated 的声明类型是什么?您是否尝试放置断点来检查对象的类型?
-
@GuillaumeS 我为您添加了断点捕获。感谢您的帮助
-
GameObjectDecorated的类型好像是MvtSensor。
-
使用装饰器时不必检查子类类型。 “Ball”类的碰撞边界必须调用 super.collisionBorder()。并且你必须在两个不同的子类中实现两个不同的碰撞边框()函数,所以不要创建 ColRebondBord,而是创建子类 ColRebondBordBall 和 ColRevondBordWall。
-
@GuillaumeS 因为在我的真实项目中我这样做:
AbstractGameObject ball = new Ball(holeSize, 0, 0);ball = new MvtSensor(ball);ball = new ColRebondBord(ball);lvl.add(ball);
标签: java subclass decorator instanceof