2012-05-31 43 views
1

我已經創建了派生類,並具有其派生的設置。構造函數中的派生設置爲'null'。基類重載構造函數不傳遞設置?

public abstract class BaseClass 
{ 
    public BaseClass(Game1 game, BaseClassSettings settings) 
    { 
     if (settings == null) 
     { 
      Console.WriteLine("BASE PANIC!"); 
     } 
    } 

    public abstract BaseClassSettings Write(); 
} 

public abstract class BaseClassSettings 
{ 
    public abstract BaseClass Load(Game1 game, BaseClassSettings settings); 
} 

當實例化類時,我重載構造函數來調用基類並創建正確派生設置的新實例。

public class DerivedFoo : BaseClass 
{ 
    public DerivedFoo(Game1 game, DerivedFooSettings settings) 
    :base(game, settings == null ? new DerivedFooSettings() : settings) 
    { 
     if (settings == null) 
     { 
      Console.WriteLine("DERIVED PANIC!"); 
     } 
    } 

    public override BaseClassSettings Write() 
    { 
     DerivedFooSettings settings = new DerivedFooSettings(); 

     return settings; 
    } 
} 

public class DerivedFooSettings : BaseClassSettings 
{ 
    public override BaseClass Load(Game1 game, BaseClassSettings settings) 
    { 
     return new DerivedFoo(game, settings as DerivedFooSettings); 
    } 
} 

這種方法的問題是,第三運營商只適用於基類和沒有通過一個新的實例到派生類的構造函數。 ('設置'保持爲空)

如何自動傳遞設置而不必在派生類的構造方法中複製第三運算符?

我無法將設置存儲在基類中,因爲它們的類型不正確。

回答

1

它的醜陋,但你可以改變base呼叫分配你傳遞settings值:

public DerivedFoo(Game1 game, DerivedFooSettings settings) 
: base(game, settings = (settings == null ? new DerivedFooSettings() : settings)) 

請注意,這不是不會改變什麼的傳遞構造函數DerivedFoo - 它只是在的構造函數中更改settings參數的值。

當然,如果BaseClass暴露Settings屬性 - 可能保護 - 並設置構造過程中,你可以只使用DerivedFoo構造體內屬性值。這將是更清潔,海事組織 - 我不認爲我有有史以來在構造函數鏈調用中使用這樣的賦值表達式,如下所示...

+0

我正在考慮在基類方法中暴露的設置屬性,當我提到將設置存儲在基類中(原始問題的最後一行)。問題是,需要將設置轉換爲每個派生類的正確派生設置。難道不是那麼醜嗎? – user1423893

+0

@ user1423893:它會有些*難看,但我認爲它會比副作用更明確。 –

相關問題