2009-05-24 4 views
5

Ho il seguente pattern Model:C'è un modo per sovraccaricare i metodi di estensione in C#?

public abstract class PARENTCLASS {...} 
public class CHILD_A_CLASS : PARENTCLASS{...} 
public static class EXTENSION{ 
    public static METHOD(this PARENTCLASS parent){...} 
    public static METHOD(this CHILD_A_CLASS child) {...} 
} 

Qualcosa come sopra, naturalmente ci saranno più bambini (e nipote) le classi, ma ho appena messo uno di loro. Il problema è che, quando ho chiamato il metodo di estensione simile al seguente:

PARENTCLASS cc = new CHILD_A_CLASS(); 
cc.METHOD(); 

eseguirà il genitore Metodo di estensione al posto di mia previsto metodo di estensione BAMBINO. Qualcuno ha idea su come implementarlo? (Non sto pensando di inserire METHOD nella classe e lasciarlo ereditare perché voglio mantenere la classe del modello pulita e lontana da altre logiche).

risposta

5

È sicuramente possibile il overload i metodi di estensione. Il tuo codice è un esempio di come farlo.

Ciò che si desidera è la possibilità di sostituire i metodi di estensione in modo tale che il tipo di esecuzione dell'oggetto determinerà la chiamata del metodo di estensione. Molto simile alla definizione di un metodo virtuale su una classe. Non esiste un supporto per la sintassi della lingua specifica per tale funzione.

Se questo è davvero importante per te, è possibile implementare manualmente la funzione. Richiede un po 'di forza bruta ma farà il lavoro. Ad esempio ...

public static class Extension { 
    public static void Method(this ParentClass p) { 
    var c = p as ChildAClass; 
    if (c != null) { 
     Method(c); 
    } else { 
     // Do parentclass action 
    } 
    } 
    public static void Method(this ChildAClass c) { 
    ... 
    } 
} 
+0

Grazie. Penso che il casting di tipo sarebbe troppo costoso per l'esecuzione e anche piuttosto maldestro per mantenere il codice come questo. Penso che cercherò un metodo alternativo per implementarlo. Il cast di tipo – xandy

+1

è abbastanza veloce, anche se potrebbe essere difficile da mantenere. –

+0

La proposta non è polimorfica, il metodo selezionato è solo corretto per il tipo di riferimento di compilazione e non per il tipo di runtime. Troppo brevemente non è vero che è prioritario - credo che sia una cattiva pratica, perché non funzionerà sempre e porterà solo a incongruenze e aspetto sbagliato e causerà più problemi. Penso che i metodi di estensione siano sbagliati perché nascondono il fatto che questi metodi non vengono inviati dinamicamente. –

1

Sfortunatamente non penso che riuscirai a ottenere quello che vuoi qui. I metodi di estensione sono statici e i metodi statici non possono essere virtuali.

Si potrebbe aggirare questo con qualcosa come la soluzione di JaredPar.

Se il tuo obiettivo è quello di separare il tuo modello da alcune implementazioni, ti suggerisco di esaminare il Pattern Bridge (GOF). "Separa un'astrazione da un'implementazione" Questo può aiutare a separare le tue preoccupazioni e mantenere la tua classe modello più pulita.