2008-11-19 41 views
5

我有一輛基礎車輛和一些兒童課程,如汽車,摩托車等。 在每個子類中都有一個函數Go(); 現在我想在Go()函數觸發時記錄每輛車的信息,並在該日誌上我想知道哪種車輛完成了它。在C#中,我可以在基類中知道從我繼承的孩子嗎?

例子:

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

我怎麼能知道在功能記錄上車基地時打電話給我()? 謝謝,

歐米

回答

15

調用從Vehicle.Go GetType()()會工作 - 但只有圍棋()實際上是調用。

強制執行的一種方法是使用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()將給您當前實例

2

這個怎麼樣的類型:

GetType().Name 
2

喬恩Skeet的答覆肯定會完成工作,但我一個人並不真的喜歡實施。我更喜歡下面的內容 - 在我看來 - 很簡單。

無論如何,.NET已經通過虛擬方法提供了對此功能的支持。

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

這會工作,你是通過它的基類或其實際類引用實例。它並不強迫你改變基類中的實現,以及所有其他面向對象的.NET的好處。

如果您完全控制基類和派生類的實現,那麼此實現應該很好地爲您提供服務。

+0

問題是,skeets模式強制人們使用Log,而你的調用base.Go()完全是可選的。 – FlySwat 2008-11-19 15:42:01

相關問題