2010-12-10 12 views
14

J'ai appris comment hériter des méthodes en ajoutant virtual à la méthode dans la classe de base et override dans la nouvelle classe. Mais que dois-je faire pour hériter des propriétés?Comment remplacer une propriété de classe héritée en 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!"; 
} 

Ce pops une erreur, en disant que les modificateurs virtual/override ne doivent pas être utilisés ici.

Répondre

25

fly n'est pas une propriété, c'est un champ. Les champs ne sont pas substituables. Vous pouvez le faire:

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

Notez que je devais marquer fly comme protected.

Mais mieux encore, je ferais quelque chose comme ceci:

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

Ça semble fonctionner, merci! :) – Rob

+3

@Downvoter: Vraiment, vous devriez expliquer. – jason

+0

J'ai vu la downvote maintenant. Je ne voulais vraiment pas vous répondre. Clic de souris parasite? Désolé pour l'incovenience, je l'ai enlevé. – Luca

3

Ce n'est pas une propriété dans votre exemple, il est un champ. Essayez d'utiliser une propriété ou marquez simplement la volée comme protégée afin de pouvoir l'accéder à votre sous-classe.

1

Ce code:

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

crée un champ, pas une propriété. De plus, pour être virtuel, votre propriété doit avoir un accès supérieur à "privé". Vous voulez probablement quelque chose comme ceci:

public virtual string Fly 
{ 
    get { return "Yes, I can!"; } 
} 
Questions connexes