2009-12-16 45 views
13

Lo siento si estoy pidiendo algo estúpido, pero estoy completamente un novato en C# y ASP.NET. Tengo un error en mi código y no lo entiendo. estoy trabajando en Visual Studio 2008.C# clase no implementa heredó miembro abstracta

En esta línea de código:

public class SQLFAQProvider : DBFAQProvider 

estoy recibiendo este error:

Moby.Commerce.DataAccess.FAQ.SQLFAQProvider does not implement inherited abstract member Moby.Commerce.DataAccess.FAQDBFAQProvider.DeleteFAQbyID(int)

Cuando voy a DBFAQProvider el error está en esta línea del código:

public abstract DBFAQ DeleteFAQbyID(int fAQID); 

¿Qué debo hacer para corregirlo?

Respuesta

19

primer pensamiento sería implementar el miembro de resumen en el ala clase heredada:

public class SQLFAQProvider : DBFAQProvider 
{ 
    public override DBFAQ DeleteFAQbyID(int fAQID) 
    { 
     //TODO: Real Code 
     return null; 
    } 
} 
+5

No tiene sentido para mí que requiera la palabra clave de anulación cuando se debe implementar un miembro abstracto. – DFTR

+2

IMO, la palabra clave 'override' se requiere correctamente en la clase concreta, ya que el miembro abstracto puede anularse más en una clase derivada de la clase concreta. De lo contrario, parecería que un miembro de la clase derivada anula un miembro no virtual o no abstracto. Además, el CLR debe poder hacer una distinción entre una implementación del miembro abstracto y un posible nuevo miembro que oculta el resumen. La verdadera pregunta es por qué no está permitido, es decir, anular y ocultar un miembro (ya sea de forma abstracta o virtual) ya que no habrá ambigüedad. – GDS

1

Su subclase (SQLFAQProvider) debe proporcionar el código de implementación para el DeleteFAQbyID método porque la clase padre (DBFAQProvider) no lo hizo.

20

implementar el método DeleteFAQbyID en su clase derivada:

public override DBFAQ DeleteFAQbyID(int fAQID) 
{ 
    // Put your code here 
} 

El punto de un método abstracto es decir, (en la clase base abstracta), "Quiero asegurarme de que este método esté disponible en todas las clases concretas que deriven de mí": depende de usted proporcionar la implementación. Es un poco como un método en una interfaz.

+0

Me gustaría volver a formular "Quiero asegurarme de que este método esté disponible en todas las clases concretas derivadas de mí" a "Quiero asegurarme de que cada clase concreta que derive de mí implemente una lógica específica personalizada para este método" – bradbury9

2

Cuando una clase hereda de una clase abstracta debe implementar todos los métodos abstractos definidos por dicha clase. Esta es la interfaz de clase, los métodos abstractos pueden considerarse funciones virtuales puras, es decir, funciones que deben ser implementadas por las clases descendidas pero que no tienen sentido para implementarse en la clase base.

9

Su subclase necesita implementar explícitamente ese método en particular.

Si usted no tiene idea de cómo hacerlo, entonces por lo menos hacer:

public override DBFAQ DeleteFAQbyID(int fAQID) 
{ 
    throw new NotImplementedException("This isn't done yet"); 
} 
2

Debido a que su clase no es SQLFAQProviderabstract, se ha de poner en práctica todos los abstract método que se hereda.

Para solucionar este problema, aplicar el método DeleteFAQbyID en SQLFAQProvider, así:

public override DBFAQ DeleteFAQbyID(int fAQID) { 
    //Do something 
} 

Como alternativa, puede hacer que su clase abstractSQLFAQProvider cambiando su declaración a public abstract class SQLFAQProvider.

3

Cuando hereda de una clase en C#, debe implementar todos los métodos marcados como abstract a menos que su clase esté marcada como abstract. Las clases abstractas son aquellas que no se pueden instanciar directamente en el tiempo de ejecución porque no implementan por completo todos los métodos requeridos que las clases base dicen que deben existir.

Los métodos abstractos son un mecanismo que permite a una clase indicar que un método en particular debe existir "eventualmente", sin tener que proporcionar una implementación en ese punto. Por lo general, utiliza clases abstractas cuando no puede o no desea dictar lo que una implementación en particular debería hacer, pero necesita predefinir un método con el que eventualmente confíe.

Para solucionar su problema o bien marcar su clase como abstracta (con la expectativa de que otro nivel de herencia llenará las piezas que faltan) o implementar DeleteFAQbyId() en su clase:

public DBFAQ DeleteFAQbyID(int fAQID) 
{ 
    // write appropriate implementation here or: 
    throw new NotImplementedException(); 
    // or possibly NotSupportedException() if the operation should can't ever be supported. 
} 
+3

Tenga en cuenta que para implementar un método uno debe declararlo como "anular", de lo contrario el error persistirá –

-2

En la clase abstracta use una propiedad de entidad como IsValid. Haga que devuelva el método abstracto que desea anular en la clase derivada.

En la clase de base abstracta:

public bool IsValid 
{ 
    get 
    { 
     return DeleteFAQbyID(); 
    } 
} 

public abstract bool DeleteFAQbyID(); 

en la clase derivada ahora se anulará el método de la clase abstracta.

Cuestiones relacionadas