2008-11-19 9 views
5

Tengo un vehículo de clase base y algunas clases para niños como auto, moto, etc. heredando del vehículo. En cada clase de niños hay una función Go(); ahora quiero registrar la información de cada vehículo cuando la función Ir() dispara, y en ese registro quiero saber qué tipo de vehículo lo hizo.En C#, ¿puedo saber en la clase base lo que los niños heredaron de mí?

Ejemplo:

public class vehicle 
{ 
     public void Go() 
     { 
      Log("vehicle X fired"); 
     } 
} 
public class car : vehicle 
{ 
     public void Go() : base() 
     { 
      // do something 
     } 
} 

¿Cómo puedo saber en la función de registro que coche me llamaron durante la base()? Gracias ,

Omri

Respuesta

15

Calling GetType() de Vehicle.Go() funcionaría - pero sólo si Go() se llama en realidad.

Una forma de hacer cumplir esto es utilizar el template method pattern:

public abstract class Vehicle 
{ 
    public void Go() 
    { 
     Log("vehicle {0} fired", GetType().Name); 
     GoImpl(); 
    } 

    protected abstract void GoImpl(); 
} 

public class Car : Vehicle 
{ 
    protected override void GoImpl() 
    { 
     // do something 
    } 
} 
4

this.GetType() le dará el tipo de la instancia actual

2

¿Qué tal esto:

GetType().Name 
2

La respuesta de Jon Skeet sin duda hace el trabajo, pero a mí realmente no me gusta la implementación. Prefiero lo siguiente que lo mantiene, en mi opinión, simple.

De todos modos, .NET proporciona soporte para esta funcionalidad ya a través de métodos virtuales.

public class Vehicle { 
    public virtual void Go() { 
      Log(this.GetType().Name); 
    } 
} 

public class Car : Vehicle { 
    public override void Go() { 
     base.Go(); 
     // Do car specific stuff 
    } 
} 

public class Bus : Vehicle { 
} 

Esto funciona ya sea que se está refiriendo a una instancia de su clase base o su clase real. No te obliga a cambiar la implementación en clases base y bueno ... todo lo demás orientado a objetos de .NET.

Si tiene control total sobre la implementación de las clases base y derivadas, esta implementación debería servirle muy bien.

+0

El punto es que el patrón de skeets obliga a las personas a usar Log, mientras que el suyo que llama a base.Go() es completamente opcional. – FlySwat

Cuestiones relacionadas