2009-08-27 12 views
6

Tengo un problema extraño que no pude resolver. Cuando intento compilar los siguientes corté me sale este error:C# Propiedades en clases base abstractas

'AbstractClass' no implementa miembro de interfaz de 'propiedad' (compilador CS0535 error)

La ayuda en línea me dice que hacer mi AbstractClass abstracto, que se es. ¿Alguien puede decirme dónde me equivoqué?

Saludos Rüdiger

public interface IBase { 
    string Property { get; } 
} 

public abstract class AbstractClass : IBase 
{ 
    public override string ToString() 
    { 
     return "I am abstract"; 
    } 
} 

public class ConcreteClass : AbstractClass 
{ 
    string Property { 
     get { 
      return "I am Concrete"; 
     } 
    } 
} 

Respuesta

19

Sus AbstractClass necesidades para proporcionar una implementación para Property desde la interfaz IBase, incluso si es sólo abstracta en sí:

public abstract class AbstractClass : IBase 
{ 
    public override string ToString() 
    { 
     return "I am abstract"; 
    } 

    public abstract string Property { get; } 
} 

Actualización: Lucas es cierto que la la implementación concreta deberá especificar que Property es una anulación, de lo contrario obtendrá un error "no implementa un miembro abstracto heredado":

public class ConcreteClass : AbstractClass 
{ 
    public override string Property { 
     get { 
      return "I am Concrete"; 
     } 
    } 
} 
+1

Gracias, eso obviamente lo resuelve. Todavía me pregunto por qué, parece ser una ruptura con la forma habitual Las interfaces se manejan en clases abstractas. –

+0

¿Qué quieres decir?Una subclase de su clase abstracta no necesariamente necesita saber que implementa IBase, solo debe ver a los miembros virtuales y abstractos que puede/debe implementar. – dahlbyk

+3

También deberá declarar 'Property' en' ConcreteClass' con el modificador 'override'. – LukeH

2

AbstractClass se supone que aplicar IBase que contiene la propiedad, y no la han aplicado

1

Es necesario poner en práctica el IBase -property Propiedad así:

public abstract class AbstractClass : IBase 
{ 
    public override string Property() 
    { 
     return "This is the base-class implementation"; 
    } 
} 

O hazlo abstracto.

2

Usted clase abstracta hace no implementa la interfaz IBase. Simplemente agregue la propiedad Property al AbstractClass.

public abstract String Property { get; } 
1

Debe implementar la propiedad de la propiedad en la clase abstracta.

3

hay que añadir implementación abstracta de la propiedad a su AbstractClass:

public abstract class AbstractClass : IBase 
{ 
    public override string ToString() 
    { 
     return "I am abstract"; 
    } 

    public abstract string Property { get; } 

} 

Y la palabra clave override a la clase concreta

2

tiene que declarar Property en AbstractClass para que cumpla con el contrato IBase .

Si desea ConcreteClass para ser capaz de anular Property entonces usted debe declarar como abstract o virtual. A continuación, deberá declarar la implementación ConcreteClass de Property con override.

public interface IBase 
    { 
     string Property { get; } 
    } 

    public abstract class AbstractClass : IBase 
    { 
     public abstract string Property { get; } 

     public override string ToString() 
     { 
      return "I am abstract"; 
     } 
    } 

    public class ConcreteClass : AbstractClass 
    { 
     public override string Property 
     { 
      get 
      { 
       return "I am Concrete"; 
      } 
     } 
    } 
Cuestiones relacionadas