J'aimerais créer une classe abstraite en C #, qui "hérite" de différentes interfaces, mais laisse la mise en œuvre concrète à la sous-classe. Toutefois, le compilateur se plaint, que la classe ne met pas en œuvre les méthodes spécifiées dans les interfaces. Je suis habitué à Java où cela a toujours travaillé, alors je ne sais pas comment il est censé travailler dans C #. Quoi qu'il en soit, c'est mon code:
7 Réponses :
Vous pouvez simplement déclarer les méthodes et les propriétés des interfaces attendez-vous comme abstrait dans votre classe abstraite. Cela oblige les sous-classes à effectuer la mise en œuvre mais ne violera pas les règles d'interfaces de C #. P>
Vous devrez ajouter des méthodes abstraites qui "implémentent" ces interfaces.
donc par exemple: p>
C'est la bonne façon de le faire. je ne connais pas la définition de votre iPartimortsSatisAffiedNotification code> Interface donc mon échantillon ne peut fournir que définir les méthodes définies dans
Idisposable code> do Pour
iPartimortsSatisAffiedNotification code> de la même manière. P> p>
Classe abstraite en bases C'est une classe normale afin qu'il doit également mettre en œuvre ces méthodes. P>
Si vous souhaitez d'autres implémentations, placez les méthodes virtuelles (ou abstraites) dans la classe abstraite elle-même p>
Ajouter des méthodes abstraites:
Comme indiqué par d'autres personnes, vous auriez besoin de marquer les méthodes comme résumé de votre classe de base, ce qui obligera les classes dérivées à mettre en œuvre. Vous pouvez exécuter ceci comme programme C # dans LINQPAD
void Main() { DerivedClass dc = new DerivedClass("hello, world"); Console.Out.WriteLine(dc); string result = dc.Notify("greetings"); Console.Out.WriteLine(result); } public interface IPartImportsSatisfiedNotification { string Notify(string msg); } public abstract class MyClass : IPartImportsSatisfiedNotification { protected string name; public MyClass(string name) { this.name = name; } abstract public string Notify(string msg); } public class DerivedClass : MyClass { public DerivedClass(string name) :base(name) { } public override string Notify(string msg) { return string.Format("Msg {0} from {1}", msg, this.name); } public override string ToString() { return this.name; } }
Vous devez ajouter une méthode abstraite dans votre classe abstraite.
Donc ajouter dans les méthodes nécessaires mais les étiquetez-les abstract