2011-11-10 48 views
4

我的問題是以下,我有一個班,我們把它叫做Theatre如何在不實例化兩次的情況下跨類共享值(或從另一個類獲取變量)。

這個Theatre有一個構造函數,我在這裏指定這個Theatre有的數量Seats

Show類,有一個集合Seats,每個都有其自己的屬性,如bool Empty

所以總結代碼:

class Theatre 
{ 
    public Theatre(int numberOfSeats) 
    { 
     this.numberOfSeats = numberOfSeats; 
    } 
} 

比方說,我們在其他地方實例化它100

Theatre myTheatre = new Theatre(100); 

對於Show類:

class Show 
{ 
    List<Seats> listOfSeats = new List<Seats>(); 
    public Show() 
    { 
     for (int i = 0; i < 100; i++) // <---- And here is my problem!! 
     { 
      //Code to add to list 
     } 
    } 
} 

我是相當新的,所以裸陪我。

我的問題是我不知道擺脫那100

我想有類似myTheatre.NumberOfSeats的東西,但我不確定那會如何工作。

我的問題是,我在另一個班級已經實例化myTheatre,所以我將不得不作出一個新的劇院內Show,只得到的議席數目,我會用什麼樣的組合物和deletagation,但是這將明確違反ISP。

但即使這樣也有問題,因爲當我製作新的Theatre時,我必須將100作爲一個paratmer,如果這種情況發生變化,我將不得不手動更改它。

所以我的問題是:

  • 我失去了一些東西明顯? (很可能)
  • 你會推薦什麼方法?
  • 是否有類似共享變量跨類? (不想使用全球一詞,因爲我不確定這是我想要的,但它可能)。

作爲一個明顯的說明,上面不是實際的代碼,只是一個表示來澄清情況。

回答

2

這是你如何解決它。通過劇院作爲參數顯示

class Theatre 
    { 
     public Theatre(int numberOfSeats) 
     { 
      NumberOfSeats = numberOfSeats; 
     } 
     public int NumberOfSeats { get; private set; } 
    } 

    class Show 
    { 
     List<Seats> listOfSeats = new List<Seats>(); 

     public Show(Theatre theatre) 
     { 
      for (int i = 0; i < theatre.NumberOfSeats; i++) // <---- And here is my problem!! 
      { 
       //Code to add to list 
      } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Theatre myTheatre = new Theatre(100); 
      Show myShow = new Show(myTheatre); 
     } 
    } 
+0

這比我想象的要容易得多,感謝這個明確的例子! +1並接受答案。 – Trufa

2

Show :: Show方法可以將劇院的實例作爲將SeatCount公開爲屬性的參數。您可以在兩個不同的影院「展示」相同的演出,而演出班則無需具備關於該影院的任何特定知識。

你也不希望它是全球性的,因爲一個Show可以在不同的影院中顯示。這就是OOP的要點。

另一種選擇是公開一個Show類的Show方法,該方法將Show實例作爲參數。

+0

好poitns,謝謝! +1 – Trufa

0

C#不是我的專業,所以這是純粹的理論;無論如何:

已經存在myTheatre.numberOfSeats的ISTM。你所要做的就是允許從外面訪問它;要麼是直接地,要麼是公開/包裝,要麼是(更好),保持私密/保護,並允許通過公共獲取者(方法)進行訪問。

在基於類的OOP你能告訴有關Theatre實例的實例Show,所以你會傳遞到Show實例的方法將Theatre實例的引用。在這種情況下,該方法可以是Show構造函數(這是一個好主意,讓一個默認的構造函數不帶任何參數,並從特殊的一個稱呼它):某處

class Show 
{ 
    List<Seats> listOfSeats = new List<Seats>(); 

    public Show() 
    { 
    } 

    public Show(Theatre theatre) 
    { 
    this(); 

    for (int i = 0, len = theatre.numberOfSeats; i < len; ++i) 
    { 
     /* Code to add to list */ 
    } 
    } 
} 

然後:

Theatre myTheatre = new Theatre(100); 
... 
Show myShow = new Show(myTheatre); 

另請參閱:Wikipedia: OOD principles and strategies

相關問題