基类可以看到派生类的受保护字段吗?

时间:2010-08-11 18:27:40

标签: c# asp.net scope

我不知道这是否与FindControl的工作方式或范围的工作方式有关。但是我的基类很难看到子类的字段。目前我正在计划派生类在基类中设置一个属性,但是有很多派生类,所以这不是一个非常有吸引力的解决方案。

public class BasePage:Page
{
    public void DoSomethingWithDerivedPageControl()
    {
        //foo is always null.
        Control foo = FindControl("Foo");
    }
}

public class DerivedPage : BasePage
{
    //In real life, this is the code generated .aspx.designer.cs file.
    protected Label Foo;
}

4 个答案:

答案 0 :(得分:4)

FindControl不使用字段 - 它使用已添加到页面的控件,并检查其ID。

据推测,在调用DoSomethingWithDerivedPageControl时,您的控件尚未添加到页面中。

如果你能告诉我们你真正想要实现的目标会很有帮助...如果所有派生类型都应该有一个名为Foo的控件,为什么不把它放在基类中来启动与?

答案 1 :(得分:2)

public abstract class BasePage:Page 
{ 
    abstract protected Label Foo {get;}
    public void DoSomethingWithDerivedPageControl() 
    { 
        Control foo = this.Foo;
    } 
} 

public class DerivedPage : BasePage 
{ 
    override protected Label Foo { get; set;} 
} 

现在,我怀疑这并不能满足你的需求。但是,基类不能/不能知道它的孩子。您在子类中查找随机字段的唯一选择是忽略它们是基础/派生的事实,并且只使用它的反射,就好像它是一个不相关的类。

答案 2 :(得分:1)

要回答标题问题,继承从基类运行到派生类,而不是其他方式。成员要么在基类中定义,要么由派生类继承,要么在派生类中定义,并且对于基类是未知的。

理所当然,引用子成员的基类无法编译,因为基类定义不了解该成员。

答案 3 :(得分:0)

哇,你甚至试图这样做是可怕的。基类不应该知道派生类的任何信息。