假设我创建了一个传递对象的方法,该方法将根据传递的对象执行操作。我该如何识别物体?
我想过使用类名来标识对象,但这可能是不切实际的,因为我可以轻松更改对象的类名,并在将来的开发过程中产生麻烦。我是对的吗?
编辑:例如,我有对象球和炸弹。如果我有另一个叫做墙的物体,墙有解决与墙碰撞的方法(例如碰撞球和炸弹的坐标),但根据碰撞对象(即球和炸弹)有不同的逻辑
答案 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);
}
}
然后在Ball
和Bomb
中提供相应的实施(两者都实现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