2016-04-25 42 views
4

我的情況當兩個類(姑且稱之爲一個)是相互關聯的(他們的方法依賴於另一個的數據),但IS-A關係是不恰當的。我可以使用組合,以便兩個對象都具有存儲其他對象的字段。但是這對我來說似乎很難看。我目前做的是通過組合物從創建另一個類Ç包含的對象,並且當我想調用類A的方法,我通過對象。我的這種方法的問題:對象是相互需要對方

  • 我需要一個對象傳遞給其他所以它開始像一個簡單的函數參數,而不是通過面向對象的方法,其中的對象封裝的數據
  • 如果我需要改變東西,我可能要修改這兩個類一個,這是不是你有什麼推薦一個好點的代碼重用

的代碼?

class Mesh: 
    method: plot(this, Solver) 
      { 
      plot data from class Solver // need to pass a Solver object, so the class is not self-contained 
      } 
    method: intersect(this, Domain) 
      { 
      do sth // depends on Domain, so we need to pass it 
      } 

class Domain: 
    method: plot(this) 
      { 
      plot data from own data // no problem 
      } 
    method: selectVertex(this, Mesh) 
      { 
      do sth // depends on Mesh, so we need to pass it 
      } 

謝謝 佐爾坦

+0

通常這不是一個好主意,讓兩個對象相互依賴。但是,如果沒有你提供一些具體的信息/代碼,很難再說更多。 –

+0

相互組合不是一個好主意,而是一個線索,說明你的類是如此相關,也許它們必須只是一個具有A和B屬性的類。但是,沒有具體的代碼是很困難的。 –

+0

是的,它們是相關的,但是如果它們是一個類,那麼我會有將幾乎所有東西放到一個類中的誘惑,這在OOP中不是很有利。 –

回答

0

「在計算機科學中的所有問題都可以通過除間接的層次過多的問題,間接的另一個層面來解決」 - 大衛惠勒。

您試圖添加另一個間接層,但它沒有解決您的問題。所以有一個根本錯誤的東西。

這裏是我的觀點:

當你有2個對象相互取決於彼此它可能暗示2類應合併在一起成爲一個更大的類其進而產生具有官能團的更大的對象都是。

爲什麼不呢?以面向對象的方式爲您的域名業務建立模型有很多方法,隨着您的域名業務的增長,您的方法可能不再適用。