看板 C_Sharp 關於我們 聯絡資訊
我原先有一種class, ex: Class ToolA { public double CalToolData(double input, out double toolData) public bool CalRes(List<double> toolDatas) } 我現在要新增另一種變形,他的ToolData比較複雜, ex: Class ToolB { public double CalToolData(double input, out ToolDataB toolDataB) public bool CalRes(List<ToolDataB> toolDataBs) } Class ToolDataB { public int x; public double y; public string z; } 我該如何用繼承加入ToolB? 目前的想法是 Interface ITool { public double CalToolData(double input, out ToolData toolData) public bool CalRes(List<ToolData> toolDatas) } abstract class ToolData {} class ToolA: ITool { 實作 public double CalToolData(double input, out ToolData toolData) public bool CalRes(List<ToolData> toolDatas) //為了共用舊code保留方法 public double CalToolData(double input, out double toolData) public bool CalRes(List<double> toolDatas) } class ToolDataA : ToolData { double tooldata; } class ToolB: ITool { 實作 public double CalToolData(double input, out ToolData toolData) public bool CalRes(List<ToolData> toolDatas) } class ToolDataB: ToolData { public int x; public double y; public string z; } 請問是否有更好的寫法? 另外,我在實做CalRes時,該如何轉型成我要的type? ConvertAll? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.224.138.227 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1655203828.A.269.html
s4300026: 那跟out object 有什麼不一樣? 06/14 19:44
s4300026: double tooldata的意義與 double y 不同嗎? 感覺是必要 06/14 19:46
s4300026: 項啊。 06/14 19:46
out object應該是跟out ToolData一樣只是ToolData可以再限制類別,但一樣無法跟 舊的out double共用,舊的double變數丟到out object編譯會報錯。 ToolDataB跟ToolDataA只是舉例,不過沒錯目前的ToolDataB裡面的確有成員 是跟原來double tooldata可以對應的,那有比較好的寫法嗎? ※ 編輯: powerD (36.224.138.227 臺灣), 06/14/2022 20:19:39
testPtt: class Tool<T> where T:ToolData,double 06/14 21:10
BusHeroVER: 樓上的應該是interface ITool<T> where T:ToolData,d 06/14 23:52
BusHeroVER: ouble 06/14 23:52
t64141: ToolA部分, virtual CalToolData(...) 06/14 23:56
t64141: CalRes<T>(List<T> toolDatas) 06/14 23:57
t64141: ToolB 繼承字 ToolA ,override CalToolData(...) 06/14 23:59
BusHeroVER: https://i.imgur.com/pId87ie.jpg 06/15 00:03
用泛型的話我工廠會編譯不過 class factory { ITool tool; } 似乎需要預先輸入泛型類型 ※ 編輯: powerD (36.224.138.227 臺灣), 06/15/2022 00:18:19
BusHeroVER: https://i.imgur.com/wWZKHNf.jpg 06/15 00:25
工廠模式我無法預先決定T ※ 編輯: powerD (36.224.138.227 臺灣), 06/15/2022 00:43:57 我原先的想法 class Manager { Tool tool; App(ToolA tool_unit) { tool = (Tool)tool_unit; } App(Tool tool_unit) { tool = tool_unit; } Cal(double input) { tool.CalToolData(input, out ToolData toolData); } } void Main() { ... //舊code App appA = new Manager(toolA); //新 App appB = new Manager((Tool)toolB); appA.Cal() appB.Cal() ... } 寫成泛型的話,我該如何寫通用的Manager, 因為要沿用舊code,Manager不可以改成泛型 ※ 編輯: powerD (36.224.138.227 臺灣), 06/15/2022 08:48:20
testPtt: 改成<out T> 06/15 08:49
testPtt: Manager<T>跟Manager no T不能並存嗎? 06/15 09:07
請問要如何共存?如果是另外新的Manager2<T>會必須維護兩套Manger ※ 編輯: powerD (36.224.138.227 臺灣), 06/15/2022 09:11:03
testPtt: Manager<T>:Manager 06/15 09:21
Litfal: 重點應該是你為何要繼承 06/15 21:41
Litfal: ToolA的data應該用ToolDataA包裝起來,不然你這樣弄得很 06/15 21:42
Litfal: 亂 06/15 21:42
Litfal: 這樣ToolB和ToolDataB都是A的擴充,就合理了 06/15 21:44
Litfal: CalRes不應該用轉型,而是ToolDataA和B各自實作自己的Cal 06/16 00:45
Litfal: Res。若你的ToolB不能吃ToolDataA,或反過來,你就要好好 06/16 00:45
Litfal: 考慮這樣的抽象關係是否合理 06/16 00:45