[問題] 請問這樣的繼承方法怎麼寫

看板C_Sharp (C#)作者 (￾ ￾ ￾N￾N￾ ￾N￾ ￾)時間2年前 (2022/06/14 18:50), 2年前編輯推噓5(5016)
留言21則, 5人參與, 2年前最新討論串1/1
我原先有一種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

06/14 19:44, 2年前 , 1F
那跟out object 有什麼不一樣?
06/14 19:44, 1F

06/14 19:46, 2年前 , 2F
double tooldata的意義與 double y 不同嗎? 感覺是必要
06/14 19:46, 2F

06/14 19:46, 2年前 , 3F
項啊。
06/14 19:46, 3F
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

06/14 21:10, 2年前 , 4F
class Tool<T> where T:ToolData,double
06/14 21:10, 4F

06/14 23:52, 2年前 , 5F
樓上的應該是interface ITool<T> where T:ToolData,d
06/14 23:52, 5F

06/14 23:52, 2年前 , 6F
ouble
06/14 23:52, 6F

06/14 23:56, 2年前 , 7F
ToolA部分, virtual CalToolData(...)
06/14 23:56, 7F

06/14 23:57, 2年前 , 8F
CalRes<T>(List<T> toolDatas)
06/14 23:57, 8F

06/14 23:59, 2年前 , 9F
ToolB 繼承字 ToolA ,override CalToolData(...)
06/14 23:59, 9F

06/15 00:03, 2年前 , 10F
用泛型的話我工廠會編譯不過 class factory { ITool tool; } 似乎需要預先輸入泛型類型 ※ 編輯: powerD (36.224.138.227 臺灣), 06/15/2022 00:18:19

06/15 00:25, 2年前 , 11F
工廠模式我無法預先決定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

06/15 08:49, 2年前 , 12F
改成<out T>
06/15 08:49, 12F

06/15 09:07, 2年前 , 13F
Manager<T>跟Manager no T不能並存嗎?
06/15 09:07, 13F
請問要如何共存?如果是另外新的Manager2<T>會必須維護兩套Manger ※ 編輯: powerD (36.224.138.227 臺灣), 06/15/2022 09:11:03

06/15 09:21, 2年前 , 14F
Manager<T>:Manager
06/15 09:21, 14F

06/15 21:41, 2年前 , 15F
重點應該是你為何要繼承
06/15 21:41, 15F

06/15 21:42, 2年前 , 16F
ToolA的data應該用ToolDataA包裝起來,不然你這樣弄得很
06/15 21:42, 16F

06/15 21:42, 2年前 , 17F
06/15 21:42, 17F

06/15 21:44, 2年前 , 18F
這樣ToolB和ToolDataB都是A的擴充,就合理了
06/15 21:44, 18F

06/16 00:45, 2年前 , 19F
CalRes不應該用轉型,而是ToolDataA和B各自實作自己的Cal
06/16 00:45, 19F

06/16 00:45, 2年前 , 20F
Res。若你的ToolB不能吃ToolDataA,或反過來,你就要好好
06/16 00:45, 20F

06/16 00:45, 2年前 , 21F
考慮這樣的抽象關係是否合理
06/16 00:45, 21F
文章代碼(AID): #1Yg6Vq9f (C_Sharp)
文章代碼(AID): #1Yg6Vq9f (C_Sharp)