因此,在單一父繼承模型中,最好的解決方案是讓代碼可擴展爲未來的變化同時保持相同的接口(我想強調這些變化不能在原始執行時已知,我的問題的主要焦點是探討支持這些變化的最佳機制/模式,因爲他們來了)?我知道這是一個非常基本的面向對象問題,下面我提供了我如何去解決它的例子,但我想知道是否有更好的解決方案來解決這個常見問題。關於繼承和可擴展性的一般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