12 votes

Accéder à une propriété d'une classe dérivée à partir de la classe de base en C#

En C#, quelle est la meilleure façon d'accéder à une propriété de la classe dérivée lorsque la liste générique ne contient que la classe de base.

public class ClassA : BaseClass
{
   public object PropertyA { get; set; }
}

public class ClassB: BaseClass
{
    public object PropertyB { get; set; }
}

public class BaseClass
{
}

public void Main
{
    List<BaseClass> MyList = new List<BaseClass>();
    ClassA a = new ClassA();
    ClassB b = new ClassB();

    MyList.Add(a);
    MyList.Add(b);

    for(int i = 0; i < MyList.Count; i++)
    {
        //I would like to access PropertyA abd PropertyB from the derived classes        
    }
}

0voto

Travis Points 6062

Vous pourriez avoir des problèmes avec les génériques et les sous-classes (dans ce cas, vous devriez revenir à System.Collections.ArrayList), mais vous devez convertir la BaseClass en sous-classe que vous souhaitez utiliser. Si vous utilisez le répertoire 'as', il réussira si la BaseClass peut être castée vers la sous-classe, ou il sera nul si elle ne peut pas être castée. Cela ressemblerait à quelque chose comme :

for(int i = 0; i < MyList.Count; i++)
{
    BaseClass bc = MyList[i];
    ClassA a = bc as ClassA;
    ClassB b = bc as ClassB;
    bc.BaseClassMethod();
    if (a != null) {
       a.PropertyA;
    }
    if (b != null) {
       b.PropertyB;
    }
}

Aussi, je dois mentionner que ça sent un peu mauvais. C'est le genre de code qui indique une hériarchie d'objets mal structurée. En général, si vous ne pouvez pas dire que a est une BaseClass, votre conception est probablement mauvaise. Mais j'espère que cela vous aidera !

0voto

Il faudrait que les propriétés soient déclarées comme virtuelles dans la classe de base et qu'elles soient ensuite remplacées dans la classe dérivée.

Ex :

public class ClassA : BaseClass
{
   public override object PropertyA { get; set; }
}

public class ClassB: BaseClass
{
    public override object PropertyB { get; set; }
}

public class BaseClass
{
    public virtual object PropertyA { get; set; }
    public virtual object PropertyB { get; set; }
}

public void Main
{
    List<BaseClass> MyList = new List<BaseClass>();
    ClassA a = new ClassA();
    ClassB b = new ClassB();

    MyList.Add(a);
    MyList.Add(b);

    for(int i = 0; i < MyList.Count; i++)
    {
     // Do something here with the Property
        MyList[i].PropertyA;
        MyList[i].PropertyB;      
    }
}

Vous devrez soit implémenter la propriété dans la classe de base pour qu'elle renvoie une valeur par défaut (telle que null), soit la rendre abstraite et obliger toutes les classes dérivées à implémenter les deux propriétés.

Vous devez également noter que vous pouvez renvoyer différentes choses pour la propriété A en la surchargeant dans les deux classes dérivées et en renvoyant différentes valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X