作者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/cn.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