【问题标题】:Can base classes see the protected fields of derived classes?基类可以看到派生类的受保护字段吗?
【发布时间】:2010-08-11 18:27:40
【问题描述】:

我不知道这是否与 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;
}

【问题讨论】:

    标签: c# asp.net scope


    【解决方案1】:

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

    大概在调用DoSomethingWithDerivedPageControl的时候你的控件还没有添加到页面中。

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

    【讨论】:

    • 啊!你让我走上正轨。它位于 Table 控件的控件集合中。我必须进行递归搜索才能找到它。无法将其移至基类,因为它是嵌入在每个页面上略有不同的表格中的标签。
    【解决方案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;} 
    } 
    

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

    【讨论】:

    • @Miochael Meadows:你知道……当我写抽象属性时,我对自己说,“我必须记住让类抽象……”
    • 优雅的解决方案,太糟糕了,我无法控制 Visual Studio 代码如何生成 .aspx.designer.cs 文件——我无法将覆盖添加到声明中. (或者有吗?)
    【解决方案3】:

    要回答您的标题问题,继承是从基类到派生类,而不是相反。成员要么在基类中定义,由派生类继承,要么在派生类中定义,基类不知道。

    按道理,引用子成员的基类无法编译,因为基类定义不知道该成员。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2020-07-28
        • 2010-09-30
        • 2018-12-31
        • 2020-12-24
        • 2022-07-20
        • 2016-03-11
        • 2011-11-10
        • 1970-01-01
        • 2019-01-20
        相关资源
        最近更新 更多