2010-12-10 36 views
14

Ho imparato come ereditare i metodi aggiungendo virtual al metodo nella classe base e override nella nuova classe. Ma cosa faccio per ereditare le proprietà?Come sovrascrivere una proprietà di classe ereditata 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!"; 
} 

questo visualizza un errore, dicendo che i modificatori virtual/override non dovrebbero essere usati qui.

risposta

25

fly non è una proprietà, è un campo. I campi non sono esagerati. Si può fare questo:

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

Nota che dovevo marcare fly come protected.

Ma ancora meglio, vorrei fare qualcosa di simile:

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

Sembra funzionare, grazie! :) – Rob

+3

@Downvoter: Davvero, dovresti spiegare. – jason

+0

Ho visto il downvote ora. Non volevo davvero minimizzare la tua risposta. Clic del mouse spuria? Scusa per l'inconveniente, l'ho rimosso. – Luca

3

Questa non è una proprietà nel tuo esempio, si tratta di un campo. Prova ad usare una proprietà, o semplicemente segnando il volo come protetto in modo che sia possibile accedervi nella sottoclasse.

1

Questo codice:

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

è la creazione di un campo, non una proprietà. Inoltre, per essere virtuale, la tua proprietà deve avere accesso superiore a "privato". Probabilmente vorrai qualcosa del genere:

public virtual string Fly 
{ 
    get { return "Yes, I can!"; } 
} 
Problemi correlati