2010-08-11 13 views
0

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

FindControl이 필드를 사용하지 않습니다 -이 페이지에 추가 된 컨트롤을 사용하고, 자신의 ID를 확인합니다.

아마도 DoSomethingWithDerivedPageControl이 호출 될 때 귀하의 컨트롤이 페이지에 추가되지 않았기 때문일 수 있습니다.

파생 된 모든 유형에 Foo이라는 컨트롤이 있어야하는 경우 실제로 시작하려고하는 것을 알려주는 것이 도움이 될 것입니다. 시작하기 위해 기본 클래스에 넣지 않는 이유는 무엇입니까?

+0

아! 너는 나를 올바른 길로 인도했다. 이 컨트롤은 Table 컨트롤의 컨트롤 컬렉션에 있습니다. 그것을 찾기 위해 재귀적인 검색을해야했습니다. 각 페이지에서 약간 다른 테이블에 포함 된 레이블이기 때문에 기본 클래스로 이동할 수 없습니다. – MatthewMartin

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;} 
} 

이제 나는 그것이 당신의 필요를 충족시키지 못한다고 생각합니다. 그러나 기본 클래스는 자녀에 대해 알지 못합니다. 자식 클래스에서 무작위 필드를 찾는 유일한 방법은 그것들이 기반/파생된다는 사실을 무시하고 관련없는 클래스 인 것처럼 그것의 반영을 사용하는 것입니다.

+0

@Miochael Meadows : Ya'know ... 추상 속성을 쓰면서 나는 "클래스를 추상화하는 것을 기억해야한다"고 말했습니다. –

+0

우아한 솔루션, 너무 나쁘지 만 컨트롤이 충분하지 않습니다. Visual Studio 코드에서 .aspx.designer.cs 파일을 생성하는 방법에 대해 - 선언에 재정의를 추가 할 방법이 없습니다. (아니면 거기 있니?) – MatthewMartin

1

제목 질문에 대답하기 위해 상속은 기본 클래스에서 파생 클래스로 실행됩니다. 멤버는 기본 클래스에 정의되어 파생 클래스에 상속되거나 파생 클래스에 정의되고 기본 멤버에게는 알 수 없습니다.

하위 클래스를 참조하는 기본 클래스가 컴파일 할 수없는 이유는 기본 클래스 정의에 해당 멤버에 대한 지식이 없기 때문입니다.

0

와우,이 일은 무서운 일입니다. 기본 클래스는 파생 클래스에 대해 아무 것도 알지 못합니다.

관련 문제