【问题标题】:Dynamically cast to subclass to use correct method overload动态转换为子类以使用正确的方法重载
【发布时间】:2014-02-20 03:02:42
【问题描述】:

我正在尝试使我的代码更具多态性。现在我有一个超类,它有四个不同的子类。我有一个接受超类作为类型的方法。我想在将其路由到其他方法以处理其他操作之前执行一些通用操作。这是我的设想:

public void performSomething(Super object) { 
    //do some generic action each time to object
    object.setSuperProperty();

    //now route to appropriate method to perform specific action
    doSpecific(object);
}

private void doSpecific(SubA object) { }

private void doSpecific(SubB object) { }

private void doSpecific(SubC object) { }

private void doSpecific(SubD object) { }

这样,如果我想添加更多功能——通过创建新的子类或其他方式——那么我只需要添加另一个具有正确子类类型的方法。但是,这是不可能的,因为编译器抱怨没有 doSpecific(Super object) 方法。相反,在performSomething(Super object)我不得不做一个丑陋的:

if(object instanceof SubA)
    doSpecific((SubA)object);
else if(object instanceof SubB)
    doSpecific((SubB)object);
...

有没有比必须执行所有instanceof 检查更好的方法来做到这一点?有没有我没有想到的设计模式?我知道我会失去编译时类型检查的安全性,但只是好奇可能存在哪些其他解决方案。

编辑:忘了提这个。 performSomethingdoSpecific 是我将调用 ClassA 的无关类的一部分。我考虑在 Super 类中创建一个抽象方法,以便子类可以正确实现它。问题是performSomethingdoSpecific 大约依赖于ClassA 的8 个不同成员。因此,如果我想将该方法委托给子类,则需要大量参数,例如subB.doSpecific(int, int, String, String, Object, int, long, blah, blah);,我不确定它是否比原来的instanceOf 检查更好。这也将在 ClassA 和我拥有的 Super/Sub 类之间创建紧密耦合,这看起来不正确,因为我只需要从中读取值。

【问题讨论】:

标签: java inheritance polymorphism


【解决方案1】:

我推荐Command Pattern

这意味着:您的每个子类都实现了一个doSpecific() 方法。那么你的初始方法如下所示:

public void performSomething(Super object) { 
    //do some generic action each time to object
    object.setSuperProperty();

    //now route to appropriate method to perform specific action
    object.doSpecific(...);
}

编译器会自动选择子类的方法 - 不用 instanceOf 为您检查。

【讨论】:

  • 对不起,我应该在我的主要帖子中提到这一点。我有太多 doSomething 依赖的成员变量。我必须以这种方式传递 8-9 个参数。
猜你喜欢
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多