[問題] Callback未定型別時的處理方式
我希望某個類別裡面有個函式
該函式的動作、輸入、輸出型態都由呼叫者決定
但實際執行的時機由該類別自己決定
類似撰寫一個輸出入型態都由自己決定的事件
而且該類別會成為集合,所以每個集合內的物件該函式的動作都不一樣
不過不知道要怎麼寫才是正確寫法,還是說這件事無法做到?
參考 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
11/26 01:41, 2F
→
11/26 01:41, , 3F
11/26 01:41, 3F
→
11/26 01:43, , 4F
11/26 01:43, 4F
我查了一下這方法
這跟我想要的作法不太一樣耶
因為他還是只能宣告幾個固定的操作方式
或是變成每個呼叫端都要寫很多方法作繼承,比較不合我的需求
比較希望用簡單的賦值方式讓呼叫端操作
不過學到新方法了,原來還有這種做法,感謝提供訊息
※ 編輯: Peruheru (220.134.18.8), 11/26/2015 16:03:21
推
11/26 21:05, , 5F
11/26 21:05, 5F
→
11/26 21:05, , 6F
11/26 21:05, 6F
→
11/26 21:57, , 7F
11/26 21:57, 7F
→
11/26 21:57, , 8F
11/26 21:57, 8F
→
11/26 21:58, , 9F
11/26 21:58, 9F
→
11/26 21:58, , 10F
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
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
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章