2011-02-12 19 views
6

Solo para aclarar, ¿es realmente obligatorio que todos los miembros de una clase infantil estén declarados en la clase abstracta que se encuentra arriba?¿Es posible definir miembro en una clase secundaria sin definirlo en la clase principal abstracta? C#

sería posible algo como esto:

public abstract class MyParent 
{ 
    public int x { get; set; } 
} 
public class MyChild : MyParent 
{ 
    public int x { get; set; } 
    public string MyName { get; private set; } 
} 

Es sólo un ejemplo ... En tal caso, la propiedad MyName no está definido en la clase padre, pero es en la clase hija ... ¿Es posible?

¡Gracias de antemano!

Respuesta

4

Sí, puede declarar propiedades y métodos adicionales en la clase secundaria.

Sin embargo, si está utilizando una variable que se declara como el tipo ancestro, solo podrá acceder a los miembros definidos en el tipo ancestro a través de esa variable. La única manera de llegar a las cosas especiales de la clase infantil es encasillar hacia abajo al tipo de niño.

Como nota aparte: la clase secundaria debe no duplicar las declaraciones realizadas en el antecesor. Su propiedad int x aquí causará problemas debido a que habrá dos propiedades x distintas corriendo alrededor. Se requiere

Una clase niño hormigón (no abstracta) para override cualquier métodos o propiedades virtuales declarados en el ancestro abstracto. Virtual y override requieren palabras clave específicas en la declaración.

2

Sí, es posible crear nuevos miembros en una clase secundaria que no estén en la clase principal. Ese es el punto de tener clases de niños. Se supone que la clase secundaria "amplía" una clase principal agregando nuevos miembros o modificando el comportamiento de los miembros existentes

Sin embargo, no es necesario recrear los miembros de la clase principal en las clases secundarias. Las clases secundarias obtienen automáticamente todos los miembros de la clase principal.

El código que ha proporcionado es un programa legal C# y significa que su intención es crear una int x diferente para la clase secundaria. Este no suele ser el caso y el compilador de Microsoft C# le dará una advertencia al respecto.

+0

Estoy confundido por esta respuesta. – spender

+1

@spender. Probar ahora – Midhat

2

sí, por supuesto, es muy normal que hagas esto. Sin embargo, lo único que no puedes hacer es acceder a la propiedad MyName si estás pasando por el padre. En ese caso, solo tendrías acceso a los comunes a MyParent.

Cuestiones relacionadas