Могут ли базовые классы видеть защищенные поля производных классов? - PullRequest
0 голосов
/ 11 августа 2010

Я не знаю, связано ли это с тем, как FindControl работает или как работает scope. Но моему базовому классу трудно видеть поля дочерних классов. В настоящее время я планирую, чтобы производный класс установил свойство в базовом классе, но есть много производных классов, так что это не очень привлекательное решение.

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 ]

4 голосов
/ 11 августа 2010

FindControl не использует поля - он использует элементы управления, которые были добавлены на страницу, и проверяет их идентификаторы.

Предположительно, ваш элемент управления не был добавлен на страницу в то время, когдаDoSomethingWithDerivedPageControl называется.

Было бы полезно, если бы вы могли рассказать нам, чего вы на самом деле пытаетесь достичь ... если все ваши производные типы должны иметь элемент управления с именем Foo, почему бы просто не поставитьэто в базовом классе для начала?

2 голосов
/ 11 августа 2010
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;} 
} 

Теперь, я подозреваю, что это не полностью удовлетворяет вашу потребность.Но базовый класс не знает о своих детях.Единственный способ найти случайное поле в дочернем классе - просто игнорировать тот факт, что они являются базовыми / производными, и просто использовать его отражение, как если бы это был не связанный класс.

1 голос
/ 11 августа 2010

Чтобы ответить на ваш заглавный вопрос, наследование идет от базового класса к производному, а не наоборот.Элемент либо определен в базовом классе и унаследован производным классом, либо определен в производном классе и неизвестен базовому классу.

Разумеется, базовый класс, ссылающийся на дочерний член, не мог 't скомпилировать, так как определение базового класса не знает об этом члене.

0 голосов
/ 12 августа 2010

Ого, это страшно, что вы даже пытаетесь это сделатьБазовый класс не должен ничего знать о производном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...