13 Stimmen

Zugriff auf eine Eigenschaft einer abgeleiteten Klasse von der Basisklasse in C#

Was ist in C# der beste Weg, um auf eine Eigenschaft der abgeleiteten Klasse zuzugreifen, wenn die generische Liste nur die Basisklasse enthält.

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

tsimon Punkte 8182

Sie könnten einige Probleme mit Generics und Unterklassen haben (in diesem Fall sollten Sie zu System.Collections.ArrayList zurückkehren), aber Sie müssen die BaseClass auf die Unterklasse casten, die Sie verwenden möchten. Wenn Sie das 'as'-Verzeichnis verwenden, wird es erfolgreich sein, wenn die BaseClass in die Unterklasse gecastet werden kann, oder es wird null sein, wenn sie nicht gecastet werden kann. Das würde etwa so aussehen:

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

Ich sollte auch erwähnen, dass es ein bisschen schlecht riecht. Dies ist die Art von Code, die auf eine schlecht strukturierte Objekthierarchie hinweist. Im Allgemeinen gilt: Wenn man nicht sagen kann, dass a IS A BaseClass ist, ist der Entwurf wahrscheinlich falsch. Aber ich hoffe, das hilft!

0voto

Sie müssten die Eigenschaften in der Basisklasse als virtuell deklarieren und sie dann in der abgeleiteten Klasse außer Kraft setzen.

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

Sie müssten entweder die Eigenschaft in der Basisklasse implementieren, um einen Standardwert (z. B. null) zurückzugeben, oder sie abstrakt machen und alle abgeleiteten Klassen zwingen, beide Eigenschaften zu implementieren.

Sie sollten auch beachten, dass Sie unterschiedliche Dinge zurückgeben könnten, z. B. für PropertyA, indem Sie es in beiden abgeleiteten Klassen überschreiben und unterschiedliche Werte zurückgeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X