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