2012-06-20 66 views
1

我的PUMP可以(充氣)我的氣球。沒問題!但是當我嘗試使用我的PUMP(彈出)BALLOON時,它確實不能很好地工作。我可以繼續使用我的PUMP,最終它會(彈出)氣球,但是我的手臂變得非常疲勞,現在我想(彈出)它。所以,相反,我得到了我的POINTY STICK和(流行)!當然,我的POINT STICK在(充氣)我的BALLOON方面效果不如PUMP(彈出)。限制成員訪問多個特定類

Class Balloon 
{ 
    Private int _volume = 0; 
    Private bool _popped = false; 

    Public Balloon() { } 

    //Restrict calling to only a PUMP object 
    Internal Inflate() 
    { 
     if (_popped) return; 

     _volume += 1; 
     if (volume > 10) this.Pop(); 
    } 

    //Restrict calling to only a POINTY STICK object 
    Internal Pop() 
    { 
     if (!_popped) _popped = true; 
    } 

    Public string GirlHappiness 
    { get 
     { 
     if (!_popped) 
      { 
      if (_volume < 3) 
       return "......"; 
      if (_volume < 6) 
       return "Ooohhh";      
      else 
       return "Ahhhh! Yay!"; 
      } 
     else 
      return "WaAaAaAaHhHhHh"; 
     } 
    } 

    Public string BoyHappiness 
    { get 
     { 
     if (!_popped) 
      { 
      if (_volume < 3) 
       return "zzzzzz"; 
      if (_volume < 6) 
       return "zzzzzz";      
      else 
       return "zzzzzz"; 
      } 
     else 
      return "Ahahaha YAY!"; 
     } 
    } 
} 

那麼,有什麼辦法可以做到這一點?我無法通過分離程序集來實現所需的結果,而我使用反射和跟蹤堆棧的其他方法在調試之外並不可靠。該怎麼辦?!

回答

0

在我腦海中彈出兩種方式:使用顯式的接口實現或事件。

如果使用顯式接口,那麼可以隱藏實現,以便那些不會以「原樣」威脅實例的實現。示例:

interface IPumpable 
    { 
     void Pump(); 
    } 
    interface IPoppable 
    { 
     void Pop(); 
    } 

    class Balloon :IPumpable, IPoppable 
    { 
     private void IPumpable.Pump() 
     { 
      throw new NotImplementedException(); 
     } 
     private void IPoppable.Pop() 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public static void PopMethod(IPoppable poppable) 
    { 
     poppable.Pop(); 
    } 
    public static void PumpMethod(IPumpable pumpable) 
    { 
     pumpable.Pump(); 
    } 

    static void Main(string[] args) 
    { 
     Balloon balloon = new Balloon(); 

     PumpMethod((IPumpable)balloon); 
     PopMethod((IPoppable)balloon); 
    } 

請注意,Pump和Pop實現可以標記爲私有。只有當您將氣球分別視爲IPumpable或IPoppable時,纔會顯示它們。