作者powerD ( NN N )
看板C_Sharp
標題[問題] 請問這樣的繼承方法怎麼寫
時間Tue Jun 14 18:50:25 2022
我原先有一種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://webptt.com/m.aspx?n=bbs/C_Sharp/M.1655203828.A.269.html
1F:推 s4300026: 那跟out object 有什麼不一樣? 06/14 19:44
2F:推 s4300026: double tooldata的意義與 double y 不同嗎? 感覺是必要 06/14 19:46
3F:→ 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
4F:→ testPtt: class Tool<T> where T:ToolData,double 06/14 21:10
5F:→ BusHeroVER: 樓上的應該是interface ITool<T> where T:ToolData,d 06/14 23:52
6F:→ BusHeroVER: ouble 06/14 23:52
7F:推 t64141: ToolA部分, virtual CalToolData(...) 06/14 23:56
8F:→ t64141: CalRes<T>(List<T> toolDatas) 06/14 23:57
9F:→ t64141: ToolB 繼承字 ToolA ,override CalToolData(...) 06/14 23:59
用泛型的話我工廠會編譯不過
class factory
{
ITool tool;
}
似乎需要預先輸入泛型類型
※ 編輯: powerD (36.224.138.227 臺灣), 06/15/2022 00:18:19
工廠模式我無法預先決定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
12F:→ testPtt: 改成<out T> 06/15 08:49
13F:→ testPtt: Manager<T>跟Manager no T不能並存嗎? 06/15 09:07
請問要如何共存?如果是另外新的Manager2<T>會必須維護兩套Manger
※ 編輯: powerD (36.224.138.227 臺灣), 06/15/2022 09:11:03
14F:→ testPtt: Manager<T>:Manager 06/15 09:21
15F:推 Litfal: 重點應該是你為何要繼承 06/15 21:41
16F:→ Litfal: ToolA的data應該用ToolDataA包裝起來,不然你這樣弄得很 06/15 21:42
17F:→ Litfal: 亂 06/15 21:42
18F:→ Litfal: 這樣ToolB和ToolDataB都是A的擴充,就合理了 06/15 21:44
19F:推 Litfal: CalRes不應該用轉型,而是ToolDataA和B各自實作自己的Cal 06/16 00:45
20F:→ Litfal: Res。若你的ToolB不能吃ToolDataA,或反過來,你就要好好 06/16 00:45
21F:→ Litfal: 考慮這樣的抽象關係是否合理 06/16 00:45