我有这个凌乱的代码,我真的想要清理,因为它有大约12个if if和每个if语句检查2个对象的instanceof,所以类似于: if(parentObj instanceof superclass&& parentObj2 instanceof superclass)
每个if语句都执行不同的东西,所以我认为多态性不会让它变得更好。此外,因为这个小功能的12个不同的超类(大多数if语句执行1个衬里)会有点荒谬。 多态无效的另一个原因是因为我无法访问父类或超类。我知道很多情况都不好,即使我从来没有真正理解为什么。在每个if语句中执行的方法不是父类,而是属于超类,因此我需要检查它们的类型,以便我可以转换它们并执行这些方法。 关于如何清理它的任何想法? 谢谢!
编辑:很抱歉由于缺乏细节,我在手机上写了这个。无论如何,下面是我正在处理的一个例子。我看过战略模式,我唯一担心的是出于同样的原因,我必须创建许多不同的类,我觉得创建许多不同的对象只是为了一直执行1个衬里会有点浪费。另外在我看来,在策略设计中,我仍然需要进行许多实例检查以了解要执行的策略。无论如何,下面是一些代码:pif (plotBlockState instanceof Sign && UpgradeBlockState instanceof Sign) {
//do Sign Stuff
}
else if (plotBlockState instanceof Chest && UpgradeBlockState instanceof Chest) {
//do Chest Stuff
}
else if (plotBlockState instanceof Dispenser && UpgradeBlockState instanceof Dispenser) {
//do Dispenser Stuff
}
else if (plotBlockState instanceof Furnace && UpgradeBlockState instanceof Furnace) {
//do Furnace Stuff
}
else if (plotBlockState instanceof BrewingStand && UpgradeBlockState instanceof BrewingStand) {
//do Brew Stand Stuff
}
else if (plotBlockState instanceof Hopper && UpgradeBlockState instanceof Hopper) {
//do hopper Stuff
}
else if (plotBlockState instanceof Dropper && UpgradeBlockState instanceof Dropper) {
//do dropper Stuff
}
else if (plotBlockState instanceof Beacon && UpgradeBlockState instanceof Beacon) {
//do beacon Stuff
}
else if (plotBlockState instanceof CreatureSpawner && UpgradeBlockState instanceof CreatureSpawner) {
//do spawner Stuff
}
else if (plotBlockState instanceof NoteBlock && UpgradeBlockState instanceof NoteBlock) {
//do noteblock Stuff
}
else if (plotBlockState instanceof Jukebox && UpgradeBlockState instanceof Jukebox) {
//do jukebox Stuff
}
else if (plotBlockState instanceof Skull && UpgradeBlockState instanceof Skull) {
//do skull Stuff
}
else if (plotBlockState instanceof CommandBlock && UpgradeBlockState instanceof CommandBlock) {
//do commandblock Stuff
}
答案 0 :(得分:8)
Strategy
模式似乎适合这种情况。 Here是维基百科文章的链接,应该足以让您入门,并且因为您提供了0代码,我想我也不会。
但是因为我感觉很好
首先,我会让他们实现一个通用接口或超类。这样你就不会需要来测试它们是什么类型的类。只需让他们调用相同的方法。 我知道你说多态性是不可能的,但我不确定为什么。如果你没有超级类的访问权限..制作一个通用界面。
例如:
// Undesirable syntax.
if(obj instanceof Dog)
{
((Dog)obj).woof();
}
else if(obj instanceof Cat)
{
((Cat)obj).meow();
}
else if(obj instanceof Lion)
{
((Lion)obj).roar();
}
现在让我们定义一些通用接口Animal
:
public interface Animal
{
public void speak();
}
现在你的instanceof
树看起来像这样:
public void makeTalk(Animal obj)
{
obj.speak();
}