J'ai actuellement 2 méthodes concrètes dans 2 classes abstraites. Une classe contient la méthode actuelle, tandis que l'autre contient la méthode héritée. Par exemple.C# delegate et abstract class
// Class #1
public abstract class ClassCurrent<T> : BaseClass<T> where T : BaseNode, new()
{
public List<T> GetAllRootNodes(int i)
{
//some code
}
}
// Class #2
public abstract class MyClassLegacy<T> : BaseClass<T> where T : BaseNode, new()
{
public List<T> GetAllLeafNodes(int j)
{
//some code
}
}
Je souhaite que la méthode correspondante s'exécute dans leurs scénarios relatifs dans l'application. Je prévois d'écrire un délégué pour gérer cela. L'idée est que je peux simplement appeler le délégué et y écrire une logique pour gérer la méthode à appeler en fonction de la classe/projet à laquelle il est appelé (au moins c'est ce que je pense que les délégués sont et comment ils sont utilisés).
Cependant, j'ai quelques questions sur ce sujet (après quelques googler):
1) Est-il possible d'avoir un délégué qui connaît les 2 méthodes (ou plus) qui résident dans différentes classes? 2) Est-il possible de créer un délégué qui génère des classes abstraites (comme dans le code ci-dessus)? (Ma conjecture est un non, puisque les délégués créent une implémentation concrète des classes passées) 3) J'ai essayé d'écrire un délégué pour le code ci-dessus. Mais je suis mis au défi sur le plan technique:
public delegate List<BaseNode> GetAllNodesDelegate(int k);
GetAllNodesDelegate del = new GetAllNodesDelegate(ClassCurrent<BaseNode>.GetAllRootNodes);
j'ai eu l'erreur suivante:
An object reference is required for the non-static field, method, property ClassCurrent<BaseNode>.GetAllRootNodes(int)
je pourrais avoir mal compris quelque chose ... mais si je dois déclarer manuellement un délégué à la classe d'appel, ET pour passer la fonction manuellement comme ci-dessus, alors je commence à me demander si le délégué est un bon moyen de gérer mon problème.
Merci.
Si vous souhaitez que le délégué mappe à une méthode spécifique s'il est de type 'ClassCurrent' (le' GetAllRootNodes') et une autre méthode s'il est de type 'MyClassLegacy' (le' GetAllLeaveNodes') alors vous devez connaître le type de l'instance. Alors que si elle partage une interface commune, il n'est pas nécessaire de connaître le type juste pour implémenter l'interface donnée. Le code pour configurer le délégué pour chaque type contiendra soit un if pour vérifier le type ou une méthode qui prend le type spécifique comme argument pour chaque type autorisé. – Cornelius
@Cornelius - que pensez-vous qu'un délégué est? Il semble que vous pensiez que c'est la même chose qu'un pointeur de fonction dans C. –
Les délégués sont plus puissants que les pointeurs de fonction car ils sont des "méthodes de première classe" et ont une fermeture, mais cela ne vous permet que de les passer polymorphiquement. éliminer la complexité de la mise en place comme dans le commentaire ci-dessus. – Cornelius