Actualmente tengo 2 métodos concretos en 2 clases abstractas. Una clase contiene el método actual, mientras que la otra contiene el método heredado. P.ej.delegado C# y clase abstracta
// 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
}
}
Quiero que el método correspondiente se ejecute en sus escenarios relativos en la aplicación. Estoy planeando escribir un delegado para manejar esto. La idea es que puedo llamar al delegado y escribir la lógica para manejar qué método llamar según la clase/proyecto desde el que se llama (al menos para eso creo que son los delegados y cómo se usan).
Sin embargo, tengo algunas preguntas sobre ese tema (después de algunas google):
1) ¿Es posible tener un delegado que conoce las 2 (o más) los métodos que residen en diferentes clases? 2) ¿Es posible crear un delegado que genere clases abstractas (como en el código anterior)? (Supongo que no, ya que los delegados crean una implementación concreta de las clases aprobadas) 3) Intenté escribir un delegado para el código anterior. Pero estoy siendo técnicamente reté:
public delegate List<BaseNode> GetAllNodesDelegate(int k);
GetAllNodesDelegate del = new GetAllNodesDelegate(ClassCurrent<BaseNode>.GetAllRootNodes);
me dieron el siguiente error:
An object reference is required for the non-static field, method, property ClassCurrent<BaseNode>.GetAllRootNodes(int)
que podría haber entendido algo ... pero si tengo que declarar manualmente un delegado en la clase de llamada, Y para pasar la función manualmente como se indicó anteriormente, entonces empiezo a cuestionar si el delegado es una buena manera de manejar mi problema.
Gracias.
Si desea que el delegado se asigne a un método específico si es de tipo 'ClassCurrent' (' GetAllRootNodes') y otro método si es de tipo 'MyClassLegacy' (' GetAllLeaveNodes'), entonces debería saber el tipo de la instancia. Mientras que si comparte una interfaz común, no es necesario conocer el tipo simplemente porque implementa la interfaz dada. El código para configurar el delegado para cada tipo contendrá un if para verificar el tipo o un método que tome el tipo específico como argumento para cada tipo permitido. – Cornelius
@ Cornelius: ¿qué crees que es un delegado? Parece que piensas que es lo mismo que un puntero de función en C. –
Los delegados son más poderosos que los punteros de función, ya que son "métodos de primera clase" y tienen cierre, pero esto solo te permitirá pasarlos polimórficamente y no elimine la complejidad de configurarlo como en el comentario anterior. – Cornelius