2010-12-10 7 views
14

Ich habe gelernt, wie Methoden erben, indem Sie virtual der Methode in der Basisklasse und override in der neuen Klasse hinzufügen. Aber was mache ich, um Eigenschaften zu übernehmen?Wie überschreiben Sie eine geerbte Klasseneigenschaft in C#?

class bird 
{ 
    private virtual string fly = "Yes, I can!"; 
    public string CanI() { return fly ; } 
} 

class penguin : bird 
{ 
    private override string fly = "No, I can't!"; 
} 

Dies erscheint eine Fehlermeldung, sagen, dass Modifikatoren virtual/override sollte hier nicht verwendet werden.

Antwort

25

fly ist keine Eigenschaft, es ist ein Feld. Felder können nicht überschrieben werden. Sie können dies tun:

class bird { 
    protected virtual string Fly { 
     get { 
      return "Yes, I can!"; 
     } 
    } 
    public string CanI() { return Fly; } 
} 

class penguin : bird { 
    protected override string Fly { 
     get { 
      return "No, I can't!"; 
     } 
    } 
} 

Bitte beachte, dass ich hatte fly als protected zu markieren.

Aber noch besser, würde ich so etwas tun:

abstract class Bird { 
    public abstract bool CanFly { get; } 
    public string SayCanFly() { 
     if(CanFly) { 
      return "Yes, I can!"; 
     } 
     else { 
      return "No, I can't!"; 
     } 
    } 
} 

class Penguin : Bird { 
    public override bool CanFly { 
     get { 
      return false; 
     } 
    } 
} 

class Eagle : Bird { 
    public override bool CanFly { 
     get { 
      return true; 
     } 
    } 
} 
+0

Scheint zu arbeiten, danke! :) – Rob

+3

@Downvoter: Wirklich, du solltest es erklären. – jason

+0

Ich habe den Downvote jetzt gesehen. Ich wollte dich wirklich nicht ablehnen. Falscher Mausklick? Entschuldigung für die Unannehmlichkeit, ich habe es entfernt. – Luca

3

Das ist nicht eine Eigenschaft in Ihrem Beispiel ist, ist es ein Feld. Versuchen Sie, eine Eigenschaft zu verwenden, oder markieren Sie einfach die Option "Als geschützt markieren", damit in Ihrer Unterklasse auf sie zugegriffen werden kann.

1

Dieser Code:

private virtual string fly = "Yes, I can!"; 

ist ein Feld zu schaffen, nicht eine Eigenschaft. Um virtuell zu sein, muss Ihre Property einen höheren Zugriff als 'privat' haben. Sie wollen wahrscheinlich so etwas:

public virtual string Fly 
{ 
    get { return "Yes, I can!"; } 
} 
Verwandte Themen