2009-04-07 20 views
9

Si tengo una clase base y dos clases derivadas, y quiero implementar la conversión entre las dos clases derivadas a mano, ¿hay alguna manera de hacerlo? (En C#)Overriding (cast)

abstract class AbsBase 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
} 

class Imp_A : AbsBase 
{ 
    private List<int> E; 
} 


class Imp_B : AbsBase 
{ 
    private int lastE; 
} 

Generalmente voy a estar Colada de Imp_A -> Imp_B y quiero que el último valor de la lista de correo para ser el 'LASTE'. Además, ¿qué pasa si hay tres o más clases de implementación (como Salario, por hora, consultor y ex empleados)

Independientemente de si esto es arquitectónicamente correcto (no puedo describir toda la aplicación y ser conciso) ¿Es posible?

Iba a escribir un convertidor, excepto que a mi entender un convertidor creará un nuevo objeto de la clase Imp_B, que no necesito porque el 'empleado' solo será una de las opciones en cualquiera hora.

-Devin

Respuesta

19

Debe implementar un operador explicit o implicit.

class Imp_A : AbsBase 
{ 
    public static explicit operator Imp_B(Imp_A a) 
    { 
     Imp_B b = new Imp_B(); 

     // Do things with b 

     return b; 
    } 
} 

Ahora puede hacer lo siguiente.

Imp_A a = new Imp_A(); 
Imp_B b = (Imp_B) a; 
+1

Tenga en cuenta que esto (obviamente) creará un nuevo objeto Imp_B. – mquander

+0

Eso es perfecto. Pero, como menciona mquander, es un objeto nuevo, que creo que es inevitable. ¿Pero significa esto que "a" no será GC hasta que caiga fuera del alcance, aunque nunca lo vuelva a usar (como un Imp_A)? – DevinB

+0

Sí, se recopilará solo si cae fuera del alcance y ya no tiene ninguna referencia sobre él. –

2

me gustaría sugerir que escribe Imp_B como este, si es posible:

class Imp_B : Imp_A 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
    private int lastE { get { return this.E.Last(); } } 
} 

Si no puede realmente obtener de impB, es imposible que "tratar" una IMPA objete como un ImpB de forma transparente de la manera que desee, ya que simplemente no son lo mismo en la memoria. Por lo tanto, implemente una conversión explícita.

+0

lo siento, tienes razón, voy a quitar A-D – DevinB

+0

Además, estas clases serán mucho más complicado, con ciertas variables que son exclusivas de cada uno. Y luego ciertas variables (como E) que están directamente relacionadas, pero no necesariamente lo mismo. – DevinB