2013-03-14 33 views
1

比方說你有2種形式:形式和FormB ..所有者窗體中的WinForms

在形式上我有一些屬性。 FormA創建FormB並設置所有者屬性。例如:

public FormA() 
{ 
    FormB = new FormB(){Owner = this}; 
} 

現在,在FormB中,如果我想訪問我在FormA上聲明的屬性。 爲什麼我看不到他們,當我寫:

Owner. // here I need to see FormA properties... 

爲什麼它不喜歡這個工作?

回答

4

你不能看到,因爲繼承和多態。

.NET中的表單繼承了名爲Form的基類。 FormA是FormB派生的類,FormB也是。現在

,形式所具有的參考的所有者的形式,

public Form Owner { get; } 

您分配了FORMA給它。沒問題!派生類可以被視爲它們的基類。但是,如果你訪問它,你回來表單,所以你需要做的是新的形式返回到你實際提供的表格:

FormA form = (FormB)Owner; 

這幾乎是一樣的做:

FormA form = Owner as FormB; 

但也有一些注意事項。 as運算符是「安全投射」,如果對象不是所提供的類型,則返回空值。

我向你推薦我們提供的代碼,當你得到時間時,研究繼承和多態性。他們是瞭解發生的關鍵。

如果我可以做一些自我推銷,我wrote a piece爲什麼你通常會避免as,你可能會發現有趣的,及時。

+0

所以如果我創建一個繼承形式這將工作? – Elior 2013-03-14 22:01:08

+0

感謝您的回答 – Elior 2013-03-14 22:08:07

+0

Jon Skeet涵蓋了'vs vs cast' [here](http://stackoverflow.com/a/496167/119477)。在這個問題的上下文中,它取決於Owner *是否應該是FormA的一個實例,或者它是否可能是FormA的一個實例。在OP的示例中,它看起來像* should *的情況,但您需要了解更多關於應用程序的知識。 – 2013-03-14 22:15:05

4

試試這個:

var forma = Owner as FormA; 
forma.Stuff = otherstuff; 
+3

你可能想要注意的是,這需要FormA.Stuff的範圍不是私人的 – 2013-03-14 21:59:38

3

原因是一個概念叫做polymorphism。更具體地說,Owner屬性的類型爲FormFormA繼承Form類型,所以從某種意義上說,它是Form以及FormA。你解決這個獲得的方式是「中投」業主作爲FormA,如下:

FormA fa = Owner as FormA; 
if (fa != null) 
{ 
    // do something 
} 

要檢查null這裏的原因是,也許有人在使用您的FormB,並先後成立了Owner屬性爲FormC,您不一定能夠控制該屬性。在這種情況下,代碼Owner as FormA將返回null。因此,空檢查確保您不會遇到任何令人討厭的驚喜。

相關問題