因此,在单一父继承模型中,最好的解决方案是让代码可扩展为未来的变化同时保持相同的接口(我想强调这些变化不能在原始执行时已知,我的问题的主要焦点是探讨支持这些变化的最佳机制/模式,因为他们来了)?我知道这是一个非常基本的面向对象问题,下面我提供了我如何去解决它的例子,但我想知道是否有更好的解决方案来解决这个常见问题。关于继承和可扩展性的一般OO问题
这就是我一直在做(示例代码是Java):
一开始,下面的两个类和接口创建:
public class Foo
{
protected int z;
}
public interface FooHandler
{
void handleFoo(Foo foo);
}
public class DefaultFooHandler implements FooHandler
{
@Override
public void handleFoo(Foo foo)
{
//do something here
}
}
该系统采用变量/只有FooHandler类型的字段,并且该对象(在本例中为DefaultFooHandler)是在几个明确定义的位置(可能有一个FooHandlerFactory)创建的,以补偿将来可能发生的任何变化。
然后,在未来的某个时间点需要扩展Foo来增加一些功能。因此,创建了两个新类:
public class ImprovedFoo extends Foo
{
protected double k;
}
public class ImprovedFooHandler extends DefaultFooHandler
{
@Override
public void handleFoo(Foo foo)
{
if(foo instanceof ImprovedFoo)
{
handleImprovedFoo((ImprovedFoo)foo);
return;
}
if(foo instanceof Foo)
{
super.handleFoo(foo);
return;
}
}
public void handleImprovedFoo(ImprovedFoo foo)
{
//do something involving ImprovedFoo
}
}
,这让我在上面的例子中畏缩的事情是,出现在ImprovedFooHandler.handleFoo
有没有办法避免使用if-statements
和instanceof
运营商if-statements
?
你在寻找访客模式吗? http://en.wikipedia.org/wiki/Visitor_pattern – Erik 2011-03-15 20:06:55
@Erik,你应该发布它作为答案) – 2011-03-15 20:08:48
@Stas:然后我必须总结模式 - 别人这样做:) – Erik 2011-03-15 20:20:14