2014-03-12 108 views
2

我有一個問題,我正在以完全相同的方式爲不同的子類型創建一個新的子項。我無法重用我調用的方法,因爲我不知道如何動態設置新實例的類型。動態設置新實例的類型

if (radioSomeType.Checked) 
{ 
    SomeType child = new SomeType(); 
    child.MdiParent = parent; 
    child.Open(); 
} 
else if(radioSomeOTherType.Checked) 
{ 
    SomeOtherType child = new SomeOTherType(); 
    child.MdiParent = parent; 
    child.Open(); 
} 

我設置一些其他屬性和調用此片內的一些其他方法爲好,但我已經在這個示例中刪除它們。

我知道如何使用接口,但我不知道如何爲實例初始設置類型。

我想,以減少重複,做這樣的事情:

if (radioSomeType.Checked) 
{ 
    SomeType child = new SomeType(); 
} 
else if(radioSomeOTherType.Checked) 
{ 
    SomeOtherType child = new SomeOTherType(); 
} 
child.MdiParent = parent; 
child.Open(); 

我的問題是,即使我嘗試使用界面,我還需要內有條件的原因形成的情況下(這是什麼我期望)。

+0

你不應該在有條件的創建obect,檢查了工廠模式:http://msdn.microsoft.com/en-us/library/ee817667.aspx –

+0

@ChrisHardie我明白你的意思,但是工廠模式在這種情況下並不有用。我正在創建MDI兒童 - 不存在至少有一個單選按鈕被選中的情況。 – grovesNL

+0

我想你誤會了。您可以將選中的單選按鈕的值傳遞給工廠,工廠將確定要傳回的對象。它可以讓您的調用代碼免於決定創建哪個對象的責任。如果你有很多單選按鈕,工廠就會很好地清理它們。 –

回答

4

你想要做的是類似於下面的代碼,其中ISomeType是一個接口,SomeTypeSomeOtherType實現。

原始代碼的問題是您在每個if語句中聲明瞭子變量,因此它不適用於該塊之外的任何代碼。

ISomeType child; 
if (radioSomeType.Checked) 
{ 
    child = new SomeType(); 
} 
else if(radioSomeOTherType.Checked) 
{ 
    child = new SomeOTherType(); 
} 
child.MdiParent = parent; 
child.Open(); 
+0

我同意,這聽起來是正確的。我以爲我已經嘗試過,但我可能是錯的。如果這是好的,我會測試它並接受它。 – grovesNL

+0

完美的作品。我將'Form'方法移到了我的界面中(這兩個表單都已經實現了這個方法)。 – grovesNL