2010-12-10 41 views
14

Aprendí a heredar métodos agregando virtual al método en la clase base y override en la nueva clase. Pero, ¿qué debo hacer para heredar propiedades?¿Cómo anular una propiedad de clase heredada 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!"; 
} 

Esto hace aparecer un error, diciendo que los modificadores virtual/override no deben ser utilizados aquí.

Respuesta

25

fly no es una propiedad, es un campo. Los campos no son anulables. Usted puede hacer esto:

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

Tenga en cuenta que tenía que marcar fly como protected.

Pero aún mejor, me gustaría hacer algo como esto:

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

Parece que funciona, gracias! :) – Rob

+3

@Downvoter: Realmente, deberías explicarlo. – jason

+0

Vi el voto a favor ahora. Realmente no quería rechazar tu respuesta. ¿Pinchazo de ratón espurio? Perdón por la incoherencia, lo eliminé. – Luca

3

Eso no es una propiedad en el ejemplo, es un campo. Intente usar una propiedad, o simplemente marcar mosca como protegida para que se pueda acceder a ella en su subclase.

1

este código:

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

es la creación de un campo, no una propiedad. Además, para ser virtual, su propiedad debe tener acceso más alto que 'privado'. Probablemente desee algo como esto:

public virtual string Fly 
{ 
    get { return "Yes, I can!"; } 
} 
Cuestiones relacionadas