我的代码有一组"工厂" (IfaceProducerProcessor
)生成相同接口(Iface
)的不同内部实现。这些工厂也应该能够稍后对他们生成的实例执行某些处理,但不能在Iface
的其他实现上执行。
毋庸置疑,调用代码不应该知道特定Iface
实例的实现细节或内部接口,只是它应该将其单独传递给原始生成器进行处理。
如何强制只将相同的具体类传递给生成它的类?泛型可能吗?
interface Iface {
void foo();
}
interface IfaceProducerProcessor {
Iface produceIface();
void processIface(Iface iface);
}
class A implements IfaceProducerProcessor {
Iface produceIface() {
return new AIfaceImpl();
}
void processIface(Iface iface) {
// How to enforce AIfaceImpl in compile-time?
if (!(iface instanceof AIfaceImpl)) {
throw IlleagalArgumentException("Expected instanceof AIfaceImpl.");
}
...
((AIfaceImpl)iface).bar();
...
}
class AIfaceImpl implements Iface {
// implementation of foo() ...
void bar() {
}
}
}
class B implements IfaceProducerProcessor {
...
class BIfaceImpl implements Iface {
...
}
}
...
如果很明显我有设计缺陷,我会很高兴听到它是什么以及如何纠正它,但请记住,这是我的代码的简化示例,以及我可以提供的具体细节。让我进入给定的设计...
答案 0 :(得分:2)
您对泛型的猜测可能效果最佳,请考虑更改IfaceProducerProcessor
。请注意通用参数I
,该参数仅适用于Iface
的实现:
interface IfaceProducerProcessor<I extends Iface> {
I produceIface();
void processIface(I iface);
}
然后类A
使用以下定义实现:
class A implements IfaceProducerProcessor<AIfaceImpl>{
public AIfaceImpl produceIface(){
/* ... */
}
public void processIface(AIfaceImpl iface){
/* ... */
}
}
通过编译器,您只需要在此特定AIfaceImpl
中使用IfaceProducerProcessor
。
然后可以对IfaceProducerProcessor
的每个实现进行相同的操作:
class B implements IfaceProducerProcessor<BIfaceImpl>{
/* ... */
}
等等。