多个操作取决于传递的对象的类型

时间:2010-05-03 13:57:05

标签: java api-design

假设我创建了一个传递对象的方法,该方法将根据传递的对象执行操作。我该如何识别物体?

我想过使用类名来标识对象,但这可能是不切实际的,因为我可以轻松更改对象的类名,并在将来的开发过程中产生麻烦。我是对的吗?

编辑:例如,我有对象球和炸弹。如果我有另一个叫做墙的物体,墙有解决与墙碰撞的方法(例如碰撞球和炸弹的坐标),但根据碰撞对象(即球和炸弹)有不同的逻辑

5 个答案:

答案 0 :(得分:7)

您要求的是instanceof运营商。

if (object instanceof SomeClass) {
  // do something
} else if (object instanceof SomeOtherClass) {
  // do something else
}

然而,这不是一个好习惯。相反,您可以使用所谓的双重调度。使传递的对象符合接口,该接口根据另一个类定义操作。所以:

public interface ThrowableItem {
   void throwAt(Wall wall);
}

public class Wall {
    void accept(ThrowableItem item) {
        item.throwAt(this);
    }
}

然后在BallBomb中提供相应的实施(两者都实现ThrowableItem

查看Visitor pattern - 您可以将操作移动到WallVisitor,它知道如何处理每个对象的分数。

答案 1 :(得分:0)

此代码将引导您使用switch考虑使用多态。这将自动取消命名问题。

答案 2 :(得分:0)

这取决于行动是什么。它们有什么关系?难道你有许多对象做同样的事情,但方式略有不同?例如,假设我有一个应该打印文档的方法,但我想要相同的方法来打印pdf和doc文件。

如果您的情况与此类似,那么您可能需要考虑使用继承,如下所示:创建一个超类,在我的示例中,我们使用print()方法将其称为Document。打印方法不必执行任何操作。然后为每种类型的文档创建一个子类,因此我将得到一个PdfDocument和一个DocDocument子类。其中每个都将为print()提供一个实现,可以打印与其相关的文档类型。

然后我写的方法是:

  public void printDocument(Document d){
        d.print();
  }

也就是说,通过定位超类类型,我不必担心每种类型的文档所做的具体操作。这样我就避免使用代码来检查传递给我的方法的对象的类型。它使代码更加健壮,以便将来扩展。

答案 3 :(得分:0)

根据上下文的不同,您可能还希望为可能传入的不同类型提供不同的方法(重载)。

public void doSomething(TypeA object) {
    // TypeA specific stuff
}
public void doSomething(TypeB object) {
    // TypeB specific stuff
}

答案 4 :(得分:0)

您可以使用instanceof但请注意陷阱。对于子类,它将是'true`,如下所示:

if (subclass instanceof superclss)  // returns true