2013-07-12 14 views
6

Mam problem z nadpisaniem właściwości pochodzącej z interfejsu. Mam jedną klasę podstawową, która implementuje interfejs. Ta klasa ma około 10 podklas. Podklasy powinny w niektórych przypadkach nadpisywać właściwość, która pochodzi z interfejsu.Zastępowanie właściwości w podklasie interfejsu Baseclass

Mój problem polega na tym, że mam dostęp do właściwości, nie wiedząc, jaki typ obiektu ma obiekt, a obiekt zawsze zwraca wartość właściwości klasy bazowej zamiast nadpisanej wartości właściwości podklasy.

Przykład Kod uproszczone:

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

} 

w innej klasie mam dostępu do właściwości, nie wiem, czy obiekt jest rodzaj podstawy lub podklasy w tej chwili

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

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

wyjściowa:

Something 
Something 

Potrzebna moc:

Something 
Something else 

((SubClass) obj) .Info wyświetli komunikat "Coś innego" , ale w tym momencie nie wiem, jakiego rodzaju obiekt jest obiektem. (Mam około 10 różnych podklas).

Czy muszę rzucać wszystkie przedmioty na prawdziwą klasę? Mam na liście 100-200 obiektów i około 10 różnych klas. Czy jest jakiś inny sposób na zrobienie tego?

każda pomoc doceniona :)

+1

Czy przesłanianie/wirtualna metoda rozwiązuje problem? –

+0

dziękuję, działa dobrze w ten sposób :) – Koryu

Odpowiedz

8

Należy dokonać realizacji nieruchomości virtual w klasie bazowej, i umieścić override zamiast new na wdrożeń w klasach pochodnych. To powinno naprawić problem.

Obecnie jedyną klasą, która zapewnia implementację właściwości Info z interfejsu Inf jest Twoja BaseClass. Zgodnie z kodem kompilator uważa, że ​​wywodząca się klasa SubClass wprowadza nową właściwość o tej samej nazwie, która jest legalna. Taka właściwość byłaby dostępna tylko wtedy, gdy klasa jest używana bezpośrednio, a nie przez interfejs.

3

Robisz to źle. Wykonaj następujące czynności:

  • declare właściwości klasy bazowej przy użyciu virtual słowa kluczowego
  • dodać override słowa kluczowego obok podklasy deklaracji właściwości
public class BaseClass : Inf 
{ 
    public virtual string Info 
    { 
     get { return "Something"; } 
    } 
} 


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

Dzięki, że wynik jest jak można się spodziewać.

Więcej o nadrzędne i polimorfizm tutaj: Polymorphism (C# Programming Guide)

2

Połamałeś łańcuch przez "nowe" właściwości.Musisz go zastąpić:

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"; } 
    } 
} 
Powiązane problemy