2013-07-12 13 views
6

Ich habe ein Problem mit dem Überschreiben einer Eigenschaft, die von einer Schnittstelle kommt. Ich habe eine Basisklasse, die ein Interface implementiert. Diese Klasse hat ungefähr 10 Unterklassen. Die Unterklassen sollten in einigen Fällen die Eigenschaft überschreiben, die von der Schnittstelle kommt.Eigenschaft in Unterklasse von Basisklasse überschreiben Schnittstelle

Mein Problem ist, dass ich auf die Eigenschaft zugreifen, ohne zu wissen, welche Art von Klasse das Objekt hat und das Objekt immer den Basisklasseneigenschaftswert anstelle des überschriebenen Unterklasseneigenschaftswerts zurückgibt.

Beispielcode vereinfacht:

public interface Inf 
{ 
    string Info 
    { 
    get;  
    } 
} 


public class BaseClass : Inf 
{ 

    public string Info 
    { 
     get { return "Something"; } 
    } 

} 


public class SubClass : BaseClass 
{ 

    new public string Info 
    { 
     get { return "Something else"; } 
    } 

} 

in einer anderen Klasse i haben die Eigenschaft zugreifen zu können, ich weiß nicht, ob der Objekttyp der Basis oder Unterklasse in diesem Moment ist

List<BaseClass> listBase = new List<BaseClass>(); 
listBase.Add(new BaseClass()); 
listBase.Add(new SubClass()); 

foreach (BaseClass obj in listBase) 
{ 
    Console.WriteLine(obj.Info); 
} 

Ausgang:

Something 
Something 

wollte Ausgabe:

Something 
Something else 

((SubClass) obj) .Info würde "Etwas anderes" ausgeben aber in diesem bestimmten Moment weiß ich nicht, welche Art von Klasse das Objekt ist. (Ich habe ungefähr 10 verschiedene Unterklassen).

Muss ich alle Objekte in ihre wahre Klasse umwandeln? Ich habe 100-200 Objekte in dieser Liste und ungefähr 10 verschiedene Klassen. Oder gibt es einen anderen Weg, dies zu tun?

jede Hilfe geschätzt :)

+1

Würde überschreiben/virtuelle Methode Ihr Problem lösen? –

+0

danke, funktioniert auf diese Weise :) – Koryu

Antwort

8

Sie sollten die Eigenschaft Implementierung virtual in der Basisklasse machen, und setzen override statt new auf den Implementierungen in abgeleiteten Klassen. Dies sollte das Problem beheben.

Derzeit ist die einzige Klasse, die die Implementierung für die Eigenschaft Info von der Schnittstelle Inf bietet, Ihre BaseClass. Entsprechend Ihrem Code denkt der Compiler, dass die abgeleitete Klasse SubClass eine neue Eigenschaft mit dem gleichen Namen einführt, die legal ist. Eine solche Eigenschaft wäre nur zugänglich, wenn Sie die Klasse direkt und nicht über eine Schnittstelle verwenden.

3

Sie tun es falsch. Sie haben folgende Möglichkeiten: erwarten

  • declare Basisklasse Eigenschaft mit virtual Stichwort
  • override Stichwort hinzufügen nächste Eigenschaft Erklärung
public class BaseClass : Inf 
{ 
    public virtual string Info 
    { 
     get { return "Something"; } 
    } 
} 


public class SubClass : BaseClass 
{ 
    public override string Info 
    { 
     get { return "Something else"; } 
    } 
} 

, dass mit dem Ergebnis ist, wie Sie zu Unterklasse.

Lesen Sie mehr über zwingende und Polymorphismus hier: Polymorphism (C# Programming Guide)

2

Sie haben die Kette durch "neue" Eigenschaft gebrochen.Sie müssen es überschreiben:

public interface Inf 
{ 
    string Info 
    { 
    get;  
    } 
} 

public class BaseClass : Inf 
{ 
    public virtual string Info 
    { 
     get { return "Something"; } 
    } 
} 

public class SubClass : BaseClass 
{  
    public override string Info 
    { 
     get { return "Something else"; } 
    } 
} 
Verwandte Themen