2010-08-11 9 views
0

Je ne sais pas si cela a à voir avec le fonctionnement de FindControl ou le fonctionnement de la portée. Mais ma classe de base a du mal à voir les champs des classes d'enfants. Actuellement, je prévois que la classe dérivée définisse une propriété dans la classe de base, mais il y a beaucoup de classes dérivées, donc ce n'est pas une solution très intéressante.Les classes de base peuvent-elles voir les champs protégés des classes dérivées?

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

Répondre

4

FindControl n'utilise pas de champs - il utilise les contrôles qui ont été ajoutés à la page, et vérifie leurs papiers d'identité.

Votre contrôle n'a probablement pas été ajouté à la page au moment où DoSomethingWithDerivedPageControl est appelée.

Il serait utile que vous nous disiez ce que vous essayez vraiment de réaliser ... si tous vos types dérivés doivent avoir un contrôle appelé Foo, pourquoi ne pas simplement le mettre dans la classe de base?

+0

Ah! Tu m'as mis sur la bonne voie. Il était dans la collection de contrôle d'un contrôle de table. J'ai dû faire une recherche récursive pour le trouver. Impossible de le déplacer vers la classe de base car il s'agissait d'une étiquette incorporée dans un tableau légèrement différent sur chaque page. – 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;} 
} 

Maintenant, je soupçonne que ce n'est pas suffisant pour répondre à vos besoins. Mais, une classe de base ne sait pas sur ses enfants. Votre seule option pour trouver un champ aléatoire dans une classe enfant est d'ignorer le fait qu'ils sont base/dérivés, et d'utiliser simplement le reflet de celui-ci, comme s'il s'agissait d'une classe non liée.

+0

@Miochael Meadows: Vous savez ... alors que j'écrivais la propriété abstraite, je me suis dit: «Je dois me rappeler de faire abstraction de la classe ...» –

+0

Solution élégante, dommage que je n'ai pas assez de contrôle sur comment le code studio visuel génère les fichiers .aspx.designer.cs - Je n'aurais pas un moyen d'ajouter le remplacement à la déclaration. (Ou est là?) – MatthewMartin

1

Pour répondre à la question de votre titre, l'héritage s'exécute de la classe de base à la classe dérivée, et non l'inverse. Un membre est défini dans une classe de base et hérité par la classe dérivée ou défini dans la classe dérivée et inconnu de la base.

Il va de soi qu'une classe de base faisant référence à un membre enfant n'a pas pu être compilée, puisque la définition de la classe de base n'a aucune connaissance de ce membre.

0

Whoa, c'est effrayant que vous essayiez même de le faire. La classe de base ne doit rien savoir de la classe dérivée.

Questions connexes