看板 C_Sharp 關於我們 聯絡資訊
我希望某個類別裡面有個函式 該函式的動作、輸入、輸出型態都由呼叫者決定 但實際執行的時機由該類別自己決定 類似撰寫一個輸出入型態都由自己決定的事件 而且該類別會成為集合,所以每個集合內的物件該函式的動作都不一樣 不過不知道要怎麼寫才是正確寫法,還是說這件事無法做到? 參考 http://tinyurl.com/phkcmwp 的方法,但是他要求在類別上加上<Tin, Tout> 但這樣一來我就不能用物件集合去處理它了,因為宣告變數時無法省略泛型型別 如果要維持物件集合的樣子,就變成不能用泛型而要針對每個輸出入型別各寫一個作多載 這種做法感覺實在太沒有彈性了不想這麼做阿orz 請問有沒有比較好的方法,或是我什麼地方觀念搞錯了嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.134.18.8 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1448434229.A.1E3.html ※ 編輯: Peruheru (220.134.18.8), 11/25/2015 15:46:09
m339606: 看不是很懂...你要的不就是泛型嗎? 11/25 19:17
不只是泛型,還要委派,而且外部只能提供委派,實際執行是在內部,所以比較像事件 委派還做得到,但泛型要加上去就會限制類別的型別 我想做的事情舉例來說 假設我是家具設計公司,然後我有一間跟我長期合作的木材加工廠 我手上有好多個案子在進行,每個案子都可能含有桌子、椅子、櫃子等家具 今天第一個案子含五件家具,桌子一張,椅子兩件,櫃子兩件 其中桌子,一件椅子和一件櫃子都用我們設計好的現成外型去製作就好 但是有一件椅子和一件櫃子客戶有要求客製化,椅子要客製化圖案,櫃子要多隔一層 我送了五個設計圖過去木材加工廠,其中有三件照設計圖做就好 但有兩件除了原本的設計圖,還加上客製化說明調整部分的文件 然後我們公司等著收貨就好,實際執行家具製造都是加工廠的事 委派就是客製化文件說明客製化內容和步驟 泛型就是客製化處理時需要的材料和成果 決定泛型會卡住就在於,如果我決定客製化文件泛型是為椅子而作而且輸入楓木 那麼我那批家具(List)就只能全部都是用楓木做椅子 class 家具製造<楓木, 椅子>{} 因為宣告List限制該類別泛型對象要一致 var 第一批訂單 = new List<家具製造<楓木, 椅子>>() 但我有可能會需要 家具製造<漂流木, 椅子> 或 家具製造<違法檜木, 鞋櫃> 這樣就無法作為List宣告了 經過網友來信討論 目前是使用 public Func<T, object> 客製化{ get; set;} 來應對固定型別要求 然後用List<家具製造<第一批訂單材料, object>>()來宣告 訂單材料就包含楓木、漂流木、違法檜木的內容,依照每次訂單不同而改變 輸出就自己轉型,將其定義寫成enum作為另外一個屬性來確定轉型後是椅子還是櫃子 雖然不是原本想像中的做法,至少目前可以運作 感謝網友幫忙
pauliaia: Chain-of-responsibility pattern 是這個嗎 11/26 01:41
pauliaia: 這是把switch case 拆出來寫的一種方法 基本上多類型別 11/26 01:41
pauliaia: 簡單的方法就是用if(物件判斷)c sharp我也很菜 11/26 01:43
我查了一下這方法 這跟我想要的作法不太一樣耶 因為他還是只能宣告幾個固定的操作方式 或是變成每個呼叫端都要寫很多方法作繼承,比較不合我的需求 比較希望用簡單的賦值方式讓呼叫端操作 不過學到新方法了,原來還有這種做法,感謝提供訊息 ※ 編輯: Peruheru (220.134.18.8), 11/26/2015 16:03:21
m339606: Sorry..你的舉例我看了三次還是不太明白 11/26 21:05
m339606: 直覺是要用interface來處理 11/26 21:05
bantime: 樓上..原PO的東西我有跟他要code來看..感覺上interface 11/26 21:57
bantime: 還是不行..因為也沒有很完整的敘述 不然也許設計上可以改 11/26 21:57
bantime: 因為我比較好奇return出來的東西要做什麼,有沒有可能 11/26 21:58
bantime: 在callback裡面處理這樣 11/26 21:58
Peruheru: 好吧我舉例難懂 囧 11/26 22:19
我的類別是寫給其他寫程式的人使用的工具 但是使用者程度有高有低 沒辦法要求大家都要懂繼承、介面的做法 委派是因為這個工具類別有部分資料需要特別處理過 像是有的地方需要拆解字串轉換後才是實際可以繼續處理的東西 有的地方則是需要將字串依照規則轉為日期格式後繼續處理 每個呼叫處都略有不同,沒辦法事先寫好所有處理方式(而且還會再修改、增加) 介面和繼承理論上可以達成類似效果,但是這會增加呼叫這個類別的難度 我寫的類別除了委派要使用者自己決定以外,其他都是類別內自己完成並傳送結果 我希望使用者只要知道"我丟物件陣列和描述資料進去後,沒出錯就是完成了"就好 而不要讓使用的人需要做太多事才能完成 所以介面和繼承對我來說是下選 因為這類別主要不是寫給我用的,我得顧及其他人撰寫時的難易度 將類別當成一個元件或控制項,給他資料給他事件然後看他表演就好 感覺上是最容易讓使用者上手的做法 大概是這樣 ※ 編輯: Peruheru (114.36.227.162), 11/26/2015 22:44:57
m339606: 不如你直接把你要想要的結果用Code表示(不用可編譯) 11/26 22:49
m339606: 或是用流程圖的方式來說明... 11/26 22:50
※ 編輯: Peruheru (114.36.227.162), 11/26/2015 23:34:24
Litfal: 如果要讓使用者簡單使用,為什麼不考慮用工廠隱藏介面建立 11/26 23:35
Litfal: 細節? 11/26 23:35
Peruheru: 我馬上去惡補工廠模式... 11/26 23:44
bantime: 我是覺得工廠模式也不會是你需要的@@ 11/27 00:06
bantime: 不然就是我沒想到適合的方式.. 11/27 00:06
Peruheru: 如果我沒搞錯工廠模式的做法,他所隱藏的細節仍然是我希 12/01 10:55
Peruheru: 望使用者可以自訂的地方,如同前面提到我並不能針對細節 12/01 10:56
Peruheru: 事先決定做法,因為每個呼叫者作法可能有細微不同處 12/01 10:56
Peruheru: 所以我的類別應該無法適用工廠方法 12/01 10:57