2008-11-19 10 views
5

Posiadam pojazd klasy podstawowej i niektóre klasy dzieci takie jak samochód, motocykl itp. Dziedziczący z pojazdu. W każdej klasie dziecięcej znajduje się funkcja Go(); teraz chcę rejestrować informacje o każdym pojeździe, gdy uruchomi się funkcja Go(), a na tym dzienniku chcę wiedzieć, który pojazd to zrobił.W języku C#, czy w klasie podstawowej mogę dowiedzieć się, jakie dzieci odziedziczyły po mnie?

Przykład:

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

Skąd mogę wiedzieć, w funkcji Log tego samochodu zadzwonił do mnie podczas podstawy()? Dzięki,

Omri

Odpowiedz

15

Wywołanie GetType() z Vehicle.Go() będzie działać - ale tylko wtedy, gdy Go() faktycznie nazywa.

Jednym ze sposobów egzekwowania tego jest użycie 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() daje typ bieżącej instancji

2

Jak ten temat:

GetType().Name 
2

Odpowiedź Jona Skeeta z pewnością jest wykonywana, ale ja naprawdę nie podoba mi się wdrożenie. Wolę następujące, które utrzymują - moim zdaniem - proste.

W każdym razie. NET zapewnia obsługę tej funkcji już za pomocą metod wirtualnych.

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 { 
} 

To będzie działać Pogoda jesteś odnosząc się do instancji przez swojego klasa bazowa lub jej rzeczywista klasa. Nie zmusza cię to do zmiany implementacji w klauzulach bazowych i do wszystkich innych zorientowanych obiektowo domen .NET.

Jeśli masz pełną kontrolę nad implementacją klas podstawowych i pochodnych, to ta implementacja powinna ci dobrze służyć.

+0

Chodzi o to, że wzór skeets zmusza ludzi do używania Logu, podczas gdy twoja baza wywołująca. Go() jest całkowicie opcjonalna. – FlySwat

Powiązane problemy