J'ai créé ces classes:Comment appeler une méthode virtuelle de classe dérivée?
public abstract class Node
{
public virtual NodeModel CreateModel()
{
throw new NotImplementedException();
}
}
public class Folder : Node
{
public virtual FolderModel CreateModel()
{
// Implementation
}
}
public class Item : Node
{
public virtual ItemModel CreateModel()
{
// Implementation
}
}
Puis dans mon programme, j'ai une liste de nœud qui ne contient que des objets de l'objet et des dossiers. Lorsque je boucle sur la liste et que j'essaie d'appeler la méthode CreateModel(), c'est toujours la méthode de la classe Node qui est appelée (par conséquent, elle lève l'exception).
Je ne peux pas modifier CreateModel() pour abstrait car le type de retour est différent en fonction du type dérivé. Je me demandais s'il était possible d'avoir un type de retour différent. Je veux aussi éviter les génériques. Le fait est que Intellisense me montre la méthode de classe supérieure en jouant avec une instance de celui-ci. Si je supprime l'implémentation virtuelle de la classe supérieure, elle affiche l'implémentation de la classe de base. C'est là que je pensais que c'est réellement possible. Alors, comment puis-je forcer le programme à appeler la méthode de classe supérieure?
EDIT: La réponse est en fait simple et était juste sous mon nez. Le type de retour n'a pas d'importance car il héritera du type de retour défini dans le résumé de classe de base CreateModel(). Je viens de marquer la méthode comme abstraite dans ma classe de base et ça marche très bien. Je ne sais pas pourquoi j'ai été troublé à certains moments parce que maintenant cela me semble assez évident.
Merci à tous pour m'avoir aidé.
Avec « supérieur », voulez-vous dire la classe de base (ie. Node) ou l'une des sous-classes/classes dérivées (article ou dossier). S'il vous plaît mettre à jour votre question car il est un peu difficile ... –
Merci d'avoir signalé cette erreur. – Ucodia
C# ne peut pas faire de résolution de méthode basée sur le type de retour, donc (sauf si vous utilisez des génériques comme Jon Skeet le suggérait) je devrais vous renvoyer un objet: public virtual object CreateModel() ' –