2009-12-16 6 views
13

Je suis désolé si je demande quelque chose de stupide mais je suis complètement un débutant en C# et ASP.NET. J'ai une erreur dans mon code et je ne le comprends pas. Je travaille sur Visual Studio 2008.La classe C# n'implémente pas le membre abstrait hérité

Dans cette ligne de code:

public class SQLFAQProvider : DBFAQProvider 

Je reçois cette erreur:

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

Quand je vais à DBFAQProvider l'erreur est dans cette ligne de code:

public abstract DBFAQ DeleteFAQbyID(int fAQID); 

Que dois-je modifier pour le corriger?

Répondre

19

première pensée serait mettre en œuvre le membre abstrait dans la ala classe héritée:

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

Cela n'a pas de sens pour moi qu'il nécessite le mot-clé override lorsqu'un membre abstrait doit être implémenté. – DFTR

+2

IMO le mot-clé 'override' est requis à juste titre dans la classe concrète car le membre abstrait peut être surchargé dans une classe dérivée de celle concrète. Sinon, il semblerait qu'un membre de la classe dérivée remplace un membre non virtuel ou non abstrait. De plus, le CLR doit être capable de faire la distinction entre une implémentation du membre abstrait et un nouveau membre potentiel qui cache l'abstrait. La vraie question est alors de savoir pourquoi cela n'est pas permis, c'est-à-dire de surcharger et de cacher simultanément un membre (qu'il soit abstrait ou virtuel) puisqu'il n'y aura pas d'ambiguïté. – GDS

1

Votre sous-classe (SQLFAQProvider) doit fournir le code d'implémentation de la méthode DeleteFAQbyID car la classe parente (DBFAQProvider) ne l'a pas fait.

20

Mettre en oeuvre la méthode DeleteFAQbyID dans votre classe dérivée:

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

Le point d'une méthode abstraite est-à-dire (dans la classe de base abstraite), "Je veux m'assurer que cette méthode est disponible dans chaque classe concrète dérivant de moi" - c'est à vous de fournir la mise en œuvre. C'est un peu comme une méthode dans une interface.

+0

Je voudrais reformuler "Je veux m'assurer que cette méthode est disponible dans chaque classe concrète dérivant de moi" à "Je veux m'assurer que chaque classe concrète dérivant de moi implémente une logique spécifique pour cette méthode" – bradbury9

2

Lorsqu'une classe hérite d'une classe abstraite, elle doit implémenter toutes les méthodes abstraites définies par cette classe. C'est l'interface de classe, les méthodes abstraites peuvent être considérées comme des fonctions virtuelles pures, c'est-à-dire des fonctions qui doivent être implémentées par des classes descendantes mais qui n'ont pas de sens à être implémentées dans la classe de base.

9

Votre sous-classe doit implémenter explicitement cette méthode particulière.

Si vous ne savez pas comment le faire, au moins faire:

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

Parce que votre classe SQLFAQProvider n'est pas abstract, il doit mettre en œuvre toutes les méthodes abstract qu'il hérite.

Pour résoudre ce problème, mettre en œuvre la méthode DeleteFAQbyID dans SQLFAQProvider, comme ceci:

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

Sinon, vous pouvez faire votre SQLFAQProvider classe abstract en changeant sa déclaration à public abstract class SQLFAQProvider.

3

Lorsque vous héritez d'une classe en C#, vous devez implémenter toutes les méthodes marquées abstract à moins que votre classe ne soit elle-même marquée abstract. Les classes abstraites sont celles qui ne peuvent pas être directement instanciées au moment de l'exécution car elles n'implémentent pas complètement toutes les méthodes requises que les classes de base disent doivent exister.

Les méthodes abstraites sont un mécanisme qui permet à une classe d'indiquer qu'une méthode particulière doit "éventuellement" exister - sans avoir à fournir une implémentation à ce stade. Vous utilisez généralement des classes abstraites lorsque vous ne pouvez pas ou ne voulez pas dicter ce qu'une implémentation particulière doit faire, mais vous devez prédéfinir une méthode sur laquelle vous allez éventuellement vous appuyer.

Pour résoudre votre problème, soit la marque de votre classe comme abstraite (avec l'espoir qu'un autre niveau d'héritage remplira les pièces manquantes) ou mettre en œuvre DeleteFAQbyId() dans votre classe:

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

Notez que pour implémenter une méthode, il faut la déclarer comme "override", sinon l'erreur persistera –

-2

Dans la classe abstraite utilisez une propriété d'entité comme IsValid. Faites-le retourner la méthode abstraite que vous voulez remplacer dans la classe dérivée.

En classe de base abstraite: méthode

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

public abstract bool DeleteFAQbyID(); 

Dans la classe dérivée maintenant il remplace la classe abstraite.

Questions connexes