[問題] Callback未定型別時的處理方式

看板C_Sharp (C#)作者 (還在想)時間9年前 (2015/11/25 14:50), 9年前編輯推噓3(3019)
留言22則, 5人參與, 最新討論串1/1
我希望某個類別裡面有個函式 該函式的動作、輸入、輸出型態都由呼叫者決定 但實際執行的時機由該類別自己決定 類似撰寫一個輸出入型態都由自己決定的事件 而且該類別會成為集合,所以每個集合內的物件該函式的動作都不一樣 不過不知道要怎麼寫才是正確寫法,還是說這件事無法做到? 參考 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

11/25 19:17, , 1F
看不是很懂...你要的不就是泛型嗎?
11/25 19:17, 1F
不只是泛型,還要委派,而且外部只能提供委派,實際執行是在內部,所以比較像事件 委派還做得到,但泛型要加上去就會限制類別的型別 我想做的事情舉例來說 假設我是家具設計公司,然後我有一間跟我長期合作的木材加工廠 我手上有好多個案子在進行,每個案子都可能含有桌子、椅子、櫃子等家具 今天第一個案子含五件家具,桌子一張,椅子兩件,櫃子兩件 其中桌子,一件椅子和一件櫃子都用我們設計好的現成外型去製作就好 但是有一件椅子和一件櫃子客戶有要求客製化,椅子要客製化圖案,櫃子要多隔一層 我送了五個設計圖過去木材加工廠,其中有三件照設計圖做就好 但有兩件除了原本的設計圖,還加上客製化說明調整部分的文件 然後我們公司等著收貨就好,實際執行家具製造都是加工廠的事 委派就是客製化文件說明客製化內容和步驟 泛型就是客製化處理時需要的材料和成果 決定泛型會卡住就在於,如果我決定客製化文件泛型是為椅子而作而且輸入楓木 那麼我那批家具(List)就只能全部都是用楓木做椅子 class 家具製造<楓木, 椅子>{} 因為宣告List限制該類別泛型對象要一致 var 第一批訂單 = new List<家具製造<楓木, 椅子>>() 但我有可能會需要 家具製造<漂流木, 椅子> 或 家具製造<違法檜木, 鞋櫃> 這樣就無法作為List宣告了 經過網友來信討論 目前是使用 public Func<T, object> 客製化{ get; set;} 來應對固定型別要求 然後用List<家具製造<第一批訂單材料, object>>()來宣告 訂單材料就包含楓木、漂流木、違法檜木的內容,依照每次訂單不同而改變 輸出就自己轉型,將其定義寫成enum作為另外一個屬性來確定轉型後是椅子還是櫃子 雖然不是原本想像中的做法,至少目前可以運作 感謝網友幫忙

11/26 01:41, , 2F
Chain-of-responsibility pattern 是這個嗎
11/26 01:41, 2F

11/26 01:41, , 3F
這是把switch case 拆出來寫的一種方法 基本上多類型別
11/26 01:41, 3F

11/26 01:43, , 4F
簡單的方法就是用if(物件判斷)c sharp我也很菜
11/26 01:43, 4F
我查了一下這方法 這跟我想要的作法不太一樣耶 因為他還是只能宣告幾個固定的操作方式 或是變成每個呼叫端都要寫很多方法作繼承,比較不合我的需求 比較希望用簡單的賦值方式讓呼叫端操作 不過學到新方法了,原來還有這種做法,感謝提供訊息 ※ 編輯: Peruheru (220.134.18.8), 11/26/2015 16:03:21

11/26 21:05, , 5F
Sorry..你的舉例我看了三次還是不太明白
11/26 21:05, 5F

11/26 21:05, , 6F
直覺是要用interface來處理
11/26 21:05, 6F

11/26 21:57, , 7F
樓上..原PO的東西我有跟他要code來看..感覺上interface
11/26 21:57, 7F

11/26 21:57, , 8F
還是不行..因為也沒有很完整的敘述 不然也許設計上可以改
11/26 21:57, 8F

11/26 21:58, , 9F
因為我比較好奇return出來的東西要做什麼,有沒有可能
11/26 21:58, 9F

11/26 21:58, , 10F
在callback裡面處理這樣
11/26 21:58, 10F

11/26 22:19, , 11F
好吧我舉例難懂 囧
11/26 22:19, 11F
我的類別是寫給其他寫程式的人使用的工具 但是使用者程度有高有低 沒辦法要求大家都要懂繼承、介面的做法 委派是因為這個工具類別有部分資料需要特別處理過 像是有的地方需要拆解字串轉換後才是實際可以繼續處理的東西 有的地方則是需要將字串依照規則轉為日期格式後繼續處理 每個呼叫處都略有不同,沒辦法事先寫好所有處理方式(而且還會再修改、增加) 介面和繼承理論上可以達成類似效果,但是這會增加呼叫這個類別的難度 我寫的類別除了委派要使用者自己決定以外,其他都是類別內自己完成並傳送結果 我希望使用者只要知道"我丟物件陣列和描述資料進去後,沒出錯就是完成了"就好 而不要讓使用的人需要做太多事才能完成 所以介面和繼承對我來說是下選 因為這類別主要不是寫給我用的,我得顧及其他人撰寫時的難易度 將類別當成一個元件或控制項,給他資料給他事件然後看他表演就好 感覺上是最容易讓使用者上手的做法 大概是這樣 ※ 編輯: Peruheru (114.36.227.162), 11/26/2015 22:44:57

11/26 22:49, , 12F
不如你直接把你要想要的結果用Code表示(不用可編譯)
11/26 22:49, 12F

11/26 22:50, , 13F
或是用流程圖的方式來說明...
11/26 22:50, 13F
※ 編輯: Peruheru (114.36.227.162), 11/26/2015 23:34:24

11/26 23:35, , 14F
如果要讓使用者簡單使用,為什麼不考慮用工廠隱藏介面建立
11/26 23:35, 14F

11/26 23:35, , 15F
細節?
11/26 23:35, 15F

11/26 23:44, , 16F
我馬上去惡補工廠模式...
11/26 23:44, 16F

11/27 00:06, , 17F
我是覺得工廠模式也不會是你需要的@@
11/27 00:06, 17F

11/27 00:06, , 18F
不然就是我沒想到適合的方式..
11/27 00:06, 18F

12/01 10:55, , 19F
如果我沒搞錯工廠模式的做法,他所隱藏的細節仍然是我希
12/01 10:55, 19F

12/01 10:56, , 20F
望使用者可以自訂的地方,如同前面提到我並不能針對細節
12/01 10:56, 20F

12/01 10:56, , 21F
事先決定做法,因為每個呼叫者作法可能有細微不同處
12/01 10:56, 21F

12/01 10:57, , 22F
所以我的類別應該無法適用工廠方法
12/01 10:57, 22F
文章代碼(AID): #1MLLer7Z (C_Sharp)
文章代碼(AID): #1MLLer7Z (C_Sharp)