2011-12-09 26 views
55

que tienen esta clase Base:¿Puedo anular una propiedad en C#? ¿Cómo?

abstract class Base 
{ 
    public int x 
    { 
    get { throw new NotImplementedException(); } 
    } 
} 

y la siguiente descendencia:

class Derived : Base 
{ 
    public int x 
    { 
    get { //Actual Implementaion } 
    } 
} 

Cuando compilo me sale esta advertencia diciendo definición de x de clase derivada es la versión que va a la piel de la base de la misma. ¿Es posible anular propiedades en métodos C#?

Respuesta

75

Es necesario utilizar la palabra clave virtual

abstract class Base 
{ 
    // use virtual keyword 
    public virtual int x 
    { 
    get { throw new NotImplementedException(); } 
    } 
} 

o definir una propiedad abstracta:

abstract class Base 
{ 
    // use abstract keyword 
    public abstract int x { get; } 
} 

y utilizar override palabra clave cuando en el niño:

abstract class Derived : Base 
{ 
    // use override keyword 
    public override int x { get { ... } } 
} 

Si eres NO va a anular, puede usar la palabra clave new en mí para ocultar la definición de los padres.

abstract class Derived : Base 
{ 
    // use override keyword 
    public new int x { get { ... } } 
} 
11

Haga que la propiedad base sea abstracta y anule o use la nueva palabra clave en la clase derivada.

abstract class Base 
{ 
    public abstract int x { get; } 
} 

class Derived : Base 
{ 
    public override int x 
    { 
    get { //Actual Implementaion } 
    } 
} 

O

abstract class Base 
{ 
    public int x { get; } 
} 

class Derived : Base 
{ 
    public new int x 
    { 
    get { //Actual Implementaion } 
    } 
} 
+1

O podría utilizar virtual en la clase base, como lo mencionó Jeffrey Zhao. – jrummell

3

Cambio firma propiedad como se muestra a continuación:

Clase base

public virtual int x 
{ get { /* throw here*/ } } 

clase derivada

public override int x 
{ get { /*overriden logic*/ } } 

Si no necesita ninguna implementación en la clase Base solo use la propiedad abstracta.

Base:

public abstract int x { get; } 

Derivado:

public override int x { ... } 

yo sugeriría que el uso de abstract propiedad en lugar de trhowing excepción NotImplemented en getter, abstact modificador obligará a todas las clases derivadas para poner en práctica esta propiedad, por lo que terminará con una solución segura en tiempo de compilación.

2
abstract class Base 
{ 

    public virtual int x 
    { 
    get { throw new NotImplementedException(); } 
    } 
} 

o

abstract class Base 
{ 
    // use abstract keyword 
    public abstract int x 
    { 
    get; 
    } 
} 

Tanto en caso de tener que escribir en la clase derivada

public override int x 
    { 
    get { your code here... } 
    } 

diferencia entre los dos es que con el extracto se fuerza la clase derivada de implementar algo, y con virtaul puede proporcionar un comportamiento predeterminado que el deriver puede usar tal cual o cambiar.

3
abstract class Base 
{ 
    // use abstract keyword 
    public virtual int x 
    { 
    get { throw new NotImplementedException(); } 
    } 
} 
Cuestiones relacionadas