2013-03-14 51 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。因此,空检查确保您不会遇到任何令人讨厌的惊喜。

相关问题