J'ai une interface afin que les écrivains de classe soient obligés de mettre en œuvre certaines méthodes. Je veux aussi autoriser certaines méthodes implémentées par défaut, donc je crée une classe abstraite. Le problème est que toutes les classes héritent de la classe de base, de sorte que j'ai des fonctions d'assistance de là. P>
J'ai essayé d'écrire Comment puis-je le faire afin que je puisse avoir ces classes d'assistance et forcer les utilisateurs à mettre en œuvre certaines méthodes? p> : iclass code> dans la base abstraite, mais j'ai eu une erreur que la base n'a pas implémenté l'interface. Bien sûr, parce que je veux ce résumé et que les utilisateurs implémentent ces méthodes. En tant qu'objet de retour si j'utilise base, je ne peux pas appeler les méthodes de classe d'interface. Si j'utilise l'interface, je ne peux pas accéder aux méthodes de base. P>
3 Réponses :
Déplacez les méthodes d'interface dans la classe abstraite et déclarez-les également abstraite. À cela, les cours dérivés sont obligés de les mettre en œuvre. Si vous souhaitez un comportement par défaut, utilisez des classes abstraits, si vous souhaitez uniquement avoir la signature fixe, utilisez une interface. Les deux concepts ne se mélangent pas. P>
Assurez-vous que les méthodes de la classe de base ont le même nom que l'interface et elles sont publiques. En outre, faites-les faire virtuelle afin que les sous-classes puissent les remplacer sans les cacher.
interface IInterface {
void Do();
void Go();
}
abstract class ClassBase : IInterface {
public virtual void Do() {
// Default behaviour
}
public abstract void Go(); // No default behaviour
}
class ConcreteClass : ClassBase {
public override void Do() {
// Specialised behaviour
}
public override void Go() {
// ...
}
}
ayant face au même problème récemment, je suis proposé une solution un peu plus élégante (à mon esprit). On dirait: maintenant, selon la spécification C # (13.4.4. Mappage d'interface), dans le processus de mappage L'autre avantage significatif, comparé à la solution de MAU, est que vous n'avez pas à répertorier tous les membres de l'interface dans la classe de base abstraite. P> p> iterface code> sur concret Code> Classe, Compiler recherchera CommonMethod code> dans commonimMpl code> aussi, et il n'a même pas besoin d'être virtuel dans la classe de base! P>
Je préfère la solution de Mau. C'est explicite et rendre le compilateur faire le travail de conformité pour vous. Dans cette solution, vous pouvez oublier d'ajouter l'itinérade à la classe dérivée.
@Jouktank: ... et finalement, il va échouer sur une conversion implicite, également à la compilation. Bien que je conviens que la solution manque de stricté articulée.