假设我创建了一个传递对象的方法,并且该方法将根据传递的对象执行操作。我应该如何识别对象?
我曾想过使用类名来识别对象,但这可能不切实际,因为我可以很容易地更改对象的类名,并且在以后的开发过程中会产生头疼的问题。我对吗?
编辑:例如,我有物体球和炸弹。如果我有另一个叫做墙的对象,并且墙有解决与墙碰撞的方法(例如碰撞球和炸弹的坐标),但根据碰撞对象(即球和炸弹)有不同的逻辑
假设我创建了一个传递对象的方法,并且该方法将根据传递的对象执行操作。我应该如何识别对象?
我曾想过使用类名来识别对象,但这可能不切实际,因为我可以很容易地更改对象的类名,并且在以后的开发过程中会产生头疼的问题。我对吗?
编辑:例如,我有物体球和炸弹。如果我有另一个叫做墙的对象,并且墙有解决与墙碰撞的方法(例如碰撞球和炸弹的坐标),但根据碰撞对象(即球和炸弹)有不同的逻辑
您要的是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
然后在and中提供适当的实现Bomb
(两者都实现ThrowableItem
)
看一下访问者模式- 您可以将操作移至WallVisitor
知道如何处理每个对象的 colisions 的操作。
此代码将引导您switch
考虑使用多态性。这将自动取消命名问题。
这取决于动作是什么。它们有什么关系?是不是你有很多对象做同样的事情,但方式略有不同?例如,假设我有一个应该打印文档的方法,但我希望使用相同的方法来打印 pdf 和 doc 文件。
如果您的情况与此类似,那么您可能需要考虑使用继承,如下所示: 创建一个超类,在我的示例中,我们使用 print() 方法将其称为 Document。print 方法不需要做任何事情。然后为每种类型的文档创建一个子类,所以我最终会得到一个 PdfDocument 和一个 DocDocument 子类。这些中的每一个都将为 print() 提供一个实现,该实现可以打印与其相关的文档类型。
那么我写的方法是:
public void printDocument(Document d){
d.print();
}
也就是说,通过针对超类类型,我不必担心每种类型的文档所做的具体操作。这样我就避免了检查传递给我的方法的对象类型的代码。它使代码对未来的扩展更加健壮。
根据上下文,您可能还希望为可能传入的不同可能类型提供不同的方法(重载)。
public void doSomething(TypeA object) {
// TypeA specific stuff
}
public void doSomething(TypeB object) {
// TypeB specific stuff
}
你可以使用instanceof
,但要小心陷阱。对于以下子类,它将为“真”:
if (subclass instanceof superclss) // returns true