Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在子类上应用模式装饰器_Java_Subclass_Decorator_Instanceof - Fatal编程技术网

Java 如何在子类上应用模式装饰器

Java 如何在子类上应用模式装饰器,java,subclass,decorator,instanceof,Java,Subclass,Decorator,Instanceof,我想将模式装饰器应用到我的Android项目中,但在装饰器中,我将对象的成员资格释放到了他的类中。例如,如果我想在我的关卡中添加一个球,则装饰器ColreBord中的处理将应用于AbstractGameObject而不是球。所以我不知道我的物体是球还是墙。(一个是圆,一个是矩形) 在Level.java中: AbstractGameObject ball = new Ball (sizeball, posX, posY); ball = new ColRebondBord(ball);//ba

我想将模式装饰器应用到我的Android项目中,但在装饰器中,我将对象的成员资格释放到了他的类中。例如,如果我想在我的关卡中添加一个,则装饰器ColreBord中的处理将应用于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中,但不是:

有人知道我是否必须使用多态性(在这种情况下,我必须为每个对象球和墙做装饰)或其他想法吗

---编辑---阅读评论,有两种解决方案:(感谢@GuillaumeS和@amdev)

  • ColRebondBord的Do 2子类:ColRebondBordBall和ColRebondBordWall
  • 做两个装饰,一个装饰球,另一个装饰墙

也许还可以提出其他命题

在使用decorator时,您不必检查子类类型。类“Ball”的碰撞边界必须调用super.collisionBorder()。并且您必须在两个不同的类E中实现两个不同的collisionsBorder()函数,因此不必使用ColRebondBord,创建子类ColRebondBordBall和ColRevondBordWall。

您必须仔细考虑您想要实现的目标。然后决定装饰师是否是实现这一目标的好方法

装饰师可以将一些常见的“装饰”应用于不同但相似的对象。例如,“BackgroundDecorator”可能会将背景颜色应用于不同的形状(圆形、矩形…)。然后,基类必须支持decorator可以调用的方法“setBackground”

这里的重点是:基类必须支持decorator使用的方法,这样就不需要一些instanceof检查。它应该适用于所有不同的子类(例如,“BorderDecorator”可能需要基类中的“getBoundingBox”方法。然后,如果支持“getBoundingBox”方法,它可以应用于所有类型的元素)

装饰师也可以用于装饰。只需在基类(可能是抽象类)内定义冲突检测所需的方法。如果需要更精确的检测,边界框或多段线可能是有用的


在考虑冲突检测时,会想到使用装饰器的其他方法。某种策略也许。。。“GameObject.getColisionStrategy”…

所声明的GameObjectStrategy类型是什么?您是否尝试放置断点来检查对象的类型?@GuillaumeS我为您添加了一个断点捕获。感谢您的帮助GameObjectDecorated的类型似乎是MvtSensor。使用decorator时,您不必检查子类类型。类“Ball”的碰撞边界必须调用super.collisionBorder()。您必须在两个不同的子类中实现两个不同的collisionsBorder()函数,所以不要创建ColRebondBord,而是创建子类ColRebondBordBall和ColRevondBordWall。@GuillaumeS,因为在我的实际项目中我是这样做的:
AbstractGameObject ball=new ball(holeSize,0,0);ball=新MVT传感器(ball);ball=新ColRebondBord(ball);添加一级(球)您的愿景感兴趣,谢谢。但我认为要保留amdev的主张:做ColreBond的两个子类