对不起这个糟糕的头衔,想不出一个简洁的方式把这个..
我正在考虑拥有一个对象列表,这些对象都是特定的接口.然后,这些对象中的每一个都可以实现其他接口,但是不能保证哪个对象将实现哪个.但是,在单个循环中,我希望能够调用其进一步子类型的方法.
即3个接口:
public interface IAnimal { ... }
public interface IEggLayer { public Egg layEgg(); }
public interface IMammal { public void sweat(); }
Run Code Online (Sandbox Code Playgroud)
然后将其存储为
private List<IAnimal> animals= new ArrayList<IAnimal>();
Run Code Online (Sandbox Code Playgroud)
因此,添加到列表中的实例也可能是类型,IEggLayer或者IMammal具有完全不相关的方法.
我最初的本能就是这样做
for(IAnimal animal : animals) {
if(animal instanceof IEggLayer) {
egg = ((IEggLayer)animal).layEgg();
}
if(animal instance of IMammal) {
((IMammal)animal).sweat();
}
}
Run Code Online (Sandbox Code Playgroud)
但我总是被告知类型检查是代码应该真正被重构的标志.
由于单个对象可能同时执行[platypus],意味着单个doFunction()不适合这种情况,在这种情况下是否可以避免使用类型检查,或者这是一个类型检查是被归类为可接受的?
是否有可能迎合这种设计模式?
我为这个人为的例子道歉...
[忽略任何语法错误,请 - 它只是为了类似Java的伪代码]
我已经为EggLayer使用添加了左值,以表明有时返回类型很重要