假设我有如下情况:
类 X
有一个类型为 S
的字段 s
。
S
由两个类 A
和 B
扩展,它们都实现了一些相同的方法/字段,我们都知道这些方法/字段应该在 S
但不幸的是,情况并非如此。
现在我想做这样的事情:
"A or B" downcast_field;
if(s instanceof A)
downcast_field = (A)s;
else if (s instanceof B)
downcast_field = (B)s;
//do something common for the two cases but that need methods implemented both in A and B
问题是预先有一个允许我调用此类方法的静态类型(在 IFs
之外)。
我想由于糟糕的设计,这实际上是不可能的,我必须编写两次相同的代码,这很丑陋,但也许有一个我现在没有看到的解决方案。
最佳答案
如果您可以更改A
和B
,那么您可以为两者添加相同的接口(interface)。这将允许您将此类型提供给 downcast_field
并调用方法。
如果你不能改变A
和B
,那么你有两个选择:
您可以编写
A2
和B2
。将A
和B
中的代码复制到新类型中。这允许您修改代码(除非您无法控制这些类型的创建)。或者,您现在也可以创建扩展S
的S2
并将通用代码放在那里,然后扩展A2
/B2
来自那个。创建一个接口(interface),然后创建两个只将调用委托(delegate)给实际类型的实现。
在这个解决方案中,你可以
Wrapper downcast_field; if(s instanceof A) downcast_field = new AWrapper( (A)s ); else if (s instanceof B) downcast_field = new BWrapper( (B)s ); downcast_field.foo();
您可以使这两个包装器扩展相同的类型并将公共(public)代码移到那里。
关于java - 使用仅在运行时可获得的静态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30031972/