Attualmente ho 2 metodi concreti in 2 classi astratte. Una classe contiene il metodo corrente, mentre l'altra contiene il metodo legacy. Per esempio.C# delegato e classe astratta
// 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
}
}
Voglio che il metodo corrispondente venga eseguito nei relativi scenari nell'app. Sto pensando di scrivere un delegato per gestire questo. L'idea è che posso semplicemente chiamare il delegato e scrivere la logica al suo interno per gestire quale metodo chiamare a seconda di quale classe/progetto viene chiamato (almeno questo è ciò che penso siano i delegati e come vengono usati).
Tuttavia, ho alcune domande su questo argomento (dopo un po 'googling):
1) E' possibile avere un delegato che conosce le (o più) i metodi 2 che risiedono in classi diverse? 2) È possibile creare un delegato che genera classi astratte (come dal codice precedente)? (La mia ipotesi è un no, poiché i delegati creano un'implementazione concreta delle classi passate) 3) Ho provato a scrivere un delegato per il codice sopra. Ma sto essendo tecnicamente sfidato:
public delegate List<BaseNode> GetAllNodesDelegate(int k);
GetAllNodesDelegate del = new GetAllNodesDelegate(ClassCurrent<BaseNode>.GetAllRootNodes);
ho ottenuto il seguente errore:
An object reference is required for the non-static field, method, property ClassCurrent<BaseNode>.GetAllRootNodes(int)
potrei aver frainteso qualcosa ... ma se devo dichiarare manualmente un delegato alla classe di chiamata, E per passare manualmente la funzione come sopra, quindi sto iniziando a chiedermi se il delegato è un buon modo per gestire il mio problema.
Grazie.
Se si desidera che il delegato esegua il mapping su un metodo specifico se digita 'ClassCurrent' (il' GetAllRootNodes') e un altro metodo se è di tipo 'MyClassLegacy' (il' GetAllLeaveNodes'), allora si dovrebbe conoscere il tipo dell'istanza. Considerando che se condivide un'interfaccia comune non è necessario conoscere il tipo solo per implementare l'interfaccia specificata. Il codice per l'impostazione del delegato per ogni tipo dovrebbe contenere un se per controllare il tipo o un metodo che accetta il tipo specifico come argomento per ogni tipo consentito. – Cornelius
@Cornelius - cosa pensi che sia un delegato? Sembra che tu pensi che sia lo stesso di un puntatore a funzione in C. –
i delegati sono più potenti dei puntatori di funzione essendo che sono "metodi di prima classe" e hanno la chiusura, ma questo ti permetterebbe solo di passarli polimorficamente e non lo faranno eliminare la complessità dell'impostazione come nel commento sopra. – Cornelius