2009-05-24 13 views
5

Tengo el siguiente patrón de modelo:¿Hay alguna forma de sobrecargar los métodos de extensión en 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) {...} 
} 

Algo así como por encima, por supuesto, habrá más niños (y nieto) clases pero sólo hay que poner uno de ellos. El problema es que cuando me llamó el método de extensión como la siguiente:

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

Se ejecutará el padre Método de extensión en lugar de mi esperada-NIÑO método de extensión. ¿Alguien tiene idea de cómo implementar esto? (No estoy considerando poner el MÉTODO en la clase y dejar que haga herencia porque quiero mantener la clase de modelo limpia y lejos de otra lógica).

Respuesta

5

Sin duda es posible sobrecargar métodos de extensión. Su código es un ejemplo de cómo hacerlo exactamente.

Lo que parece querer es que la capacidad de anule los métodos de extensión de tal forma que el tipo de tiempo de ejecución del objeto determinará la llamada al método de extensión. Al igual que la definición de un método virtual en una clase. No hay soporte de sintaxis de lenguaje específico para tal característica.

Si esto es realmente importante para usted, es posible implementar la función a mano. Requiere un poco de fuerza bruta pero hará el trabajo. Por ejemplo ...

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

Gracias. Creo que el tipo de conversión sería demasiado costoso para ejecutar y también bastante torpe para mantener el código así. Creo que buscaría un método alternativo para implementar esto. – xandy

+1

el tipo de fundición es bastante rápido, aunque puede ser complicado mantenerlo. –

+0

Su propuesta no es polimórfica, el método seleccionado solo es correcto para el tipo de referencia de compilación y no el tipo de tiempo de ejecución. Demasiado en pocas palabras, no es cierto que prevalezca. Creo que es una mala práctica porque no funcionará todo el tiempo y solo dará lugar a inconsistencias, se verá mal y causará más problemas. Creo que los métodos de extensión son incorrectos ya que ocultan el hecho de que estos métodos no se envían dinámicamente. –

1

Desafortunadamente, no creo que pueda obtener lo que desea aquí. Los métodos de extensión son estáticos y los métodos estáticos no pueden ser virtuales.

Puede solucionar esto con algo como la solución de JaredPar.

Si su objetivo es separar su modelo de alguna implementación, le sugiero que consulte el Bridge Pattern (GOF). "Separar una abstracción de una implementación" Esto puede ayudar a separar sus preocupaciones y mantener su clase de modelo más limpia.

Cuestiones relacionadas